Почему моя реализация 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])

Также связано:

  1. Почему scala.collection.immutable.List[Object] не GenTraversableOnce[?]
Другие вопросы по тегам