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