Почему 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 List, как я могу получить TraversableOnce?), scala.collection.immutable.List является Iterable и, следовательно, также GenTraversableOnce, И все же эта ошибка, кажется, указывает на обратное. И более того, когда я на самом деле смотрю на ссылку в принятом ответе этого поста, я не вижу никакой ссылки на слово "traversable".

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

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. Та же история с eta-расширениями: почему моя реализация Haskellsnd не компилируется в Scala
Другие вопросы по тегам