Почему scala.collection.immutable.List[Object] не GenTraversableOnce[?]

Простой вопрос, и извините, если это глупый вопрос, так как я только начинаю в scala. Я получаю сообщение об ошибке несоответствия типа:

found   : (AnyRef, org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable) => List[Object]
required: ((AnyRef, org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable)) => scala.collection.GenTraversableOnce[?]

Но согласно этому сообщению (у меня есть Scala Список, как я могу получить TraversableOnce?), scala.collection.immutable.List это Iterable и, следовательно, также GenTraversableOnce. И все же эта ошибка, кажется, указывает на обратное. И, кроме того, когда я действительно смотрю на ссылку в принятом ответе на этот пост, я не вижу никакой ссылки на слово «проходной».

Если проблема связана с тем, что мой внутренний класс неверен, то я должен сказать, что эта ошибка крайне неинформативна, поскольку требует, чтобы внутренний класс был типа "?" очевидно, бессодержательное утверждение ... Будем признательны за любую помощь в понимании этого.


person Paul    schedule 10.09.2018    source источник


Ответы (1)


Function2[X, Y, Z] это не то же самое, что Function1[(X, Y), Z].

Сравните эти два определения:

val f: ((Int, Int)) => Int = xy => xy._1 + xy._2
val f: (Int, Int) => Int = (x, y) => x + y

Первый также может быть написан с сопоставлением с образцом, который сначала разлагает кортеж:

val f: ((Int, Int)) => Int = { case (x, y) => x + y }

Это именно то, что вам предлагается сделать в сообщении об ошибке: предоставить унарную функцию, которая принимает в качестве аргумента кортеж, а не бинарную функцию. Обратите внимание, что существует метод tupled, который делает именно это.

Типы возвращаемых функций здесь в основном не имеют значения, компилятор не может их унифицировать, потому что он не работает с типами входных данных.


Также связаны:

  1. Та же история с эта-расширениями: >Почему моя реализация Haskell snd не компилируется в Scala
person Andrey Tyukin    schedule 10.09.2018
comment
@Paul Другими словами, List является TraversableOnce, проблема не в этом. Проблема в том, что вы предоставили функцию, которая принимает два параметра, тогда как код ожидает функцию, которая принимает один параметр, который является кортежем 2 (обратите внимание на круглые скобки в сообщении об ошибке). - person Zoltán; 10.09.2018
comment
@Zoltán Обратите внимание, что Paul не будет уведомлен, потому что он не участвовал в комментариях под этим ответом. Но да, и заголовок вопроса, и тело вопроса по существу не связаны с реальной проблемой. Моя единственная надежда найти его позже - через тег arity и добавленные вручную фактически связанные ссылки... - person Andrey Tyukin; 10.09.2018
comment
@ Золтан, спасибо за ответ. Я понимаю вашу точку зрения, хотя немного удивительно, что нет простого преобразования из ((Int, Int)) в (Int, Int). На самом деле это отображение кажется в точности каноническим отображением проекции; т. е. карта, которая принимает функцию «многие к одному» с диапазоном в пространстве произведений и отображает ее «один к одному» с произведением нескольких функций «один к одному». Кажется, это можно было бы интерпретировать автоматически - person Paul; 10.09.2018
comment
@Paul Это выглядит обманчиво просто, когда дело доходит до различий ((Int, Int)) и (Int, Int). Это уже не выглядит так просто, как только у вас есть перегруженные методы с общими параметрами A, которые могут соответствовать как Int, так и (Int, Int), или когда у вас есть унификация типов более высокого типа, что опять же сложнее... - person Andrey Tyukin; 10.09.2018
comment
Я вижу вашу точку зрения. Я думаю, что мне нужно будет потратить еще немного времени на взлом scala, прежде чем я полностью освоюсь с этим материалом. В любом случае, теперь это работает! - person Paul; 10.09.2018