Почему моя реализация Haskell не компилируется в Scala?
Я определил следующую функцию в соответствии с Haskell snd
def snd[T](pair: (_, T)): T = pair._2
Пытаясь использовать его с List[ListNode[T]]
не компилируется Почему бы и нет?
list
.reduceOption(snd)
где:
case class ListNode[T](data: T, var next: Option[ListNode[T]])(implicit ordering: Ordering[T]) extends Ordered[ListNode[T]] {...}
Ошибка:
Type mismatch, expected: (NonInferedA1, NonInferedA1) => NonInferedA1, actual Tuple2[_, Nothing] => Nothing
1 ответ
Решение
Методы reduce
а также reduceOption
требовать функции с арностью 2
, не унарные функции, которые принимают кортеж.
Есть разница между
Function1[(X, Y), Z]
а также
Function2[X, Y, Z]
Первый - унарный и принимает кортеж, второй - двоичный. То же самое касается методов и их eta-расширений.
Это здесь работает как ожидалось:
def twoArgSnd[T](a: Any, b: T): T = b
list.reduceOption(twoArgSnd[Int])
Также связано: