Почему 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. И все же эта ошибка, кажется, говорит об обратном. Более того, когда я на самом деле смотрю ссылку в принятом ответе на этот пост, я не вижу никакой ссылки на слово «проходимый».

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

0
0
255
1

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

@Paul Другими словами, Listявляется это TraversableOnce, проблема не в этом. Проблема в том, что вы предоставили функцию, которая принимает параметры два, тогда как код ожидает функцию, которая принимает параметр Один, который является кортежем 2 (обратите внимание на круглые скобки в сообщении об ошибке).

Zoltán 10.09.2018 10:44

@ Zoltán Обратите внимание, что Paul не будет уведомлен, потому что он не участвовал в комментариях под этим ответом. Но да, и заголовок, и тело вопроса по сути не имеют отношения к реальной проблеме. Моя единственная надежда найти его позже - через тег arity и добавленные вручную "действительно связанные" ссылки ...

Andrey Tyukin 10.09.2018 10:51

@ Zoltán, спасибо за ответ. Я понимаю вашу точку зрения, хотя немного удивительно, что нет простого преобразования из ((Int, Int)) в (Int, Int). На самом деле это отображение кажется в точности каноническим отображением проекции; то есть карта, которая принимает функцию "многие к одному" с диапазоном в пространстве продукта и сопоставляет ее однозначно с произведением нескольких однозначных функций. Похоже, это можно было бы интерпретировать автоматически

Paul 10.09.2018 11:24

@Paul Это кажется обманчиво простым, когда дело касается различия между ((Int, Int)) и (Int, Int). Это уже не выглядит так просто, если у вас есть перегруженные методы с общими параметрами A, которые могут соответствовать как Int, так и (Int, Int), или когда у вас есть объединение более высокодородных типов, что снова становится сложнее ...

Andrey Tyukin 10.09.2018 11:36

Я понимаю вашу точку зрения. Я думаю, мне нужно будет потратить больше времени на взлом scala, прежде чем я полностью освоюсь с этим. Во всяком случае, сейчас работает!

Paul 10.09.2018 11:58

@Paul Если это полностью отвечает на ваш вопрос, вы можете отметьте, что вопрос решен. Или, в противном случае, расскажите нам, что еще вы хотели бы узнать.

Andrey Tyukin 10.09.2018 12:01

Другие вопросы по теме