Почему 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
метод, который делает именно это.
Типы возвращаемых функций здесь в основном не имеют значения, компилятор не может их унифицировать, потому что он не работает с типами входных данных.
Также связано:
- Та же история с eta-расширениями: почему моя реализация Haskell
snd
не компилируется в Scala