Почему scala.collection.immutable.List [Object] не является GenTraversableOnce [?] - PullRequest
0 голосов
/ 10 сентября 2018

Простой вопрос, и извините, если это глупый вопрос, так как я только начинаю в 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 Ответ

0 голосов
/ 10 сентября 2018

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-расширениями: Почему моя реализация Haskell snd не компилируется в Scala
...