为什么我的 Haskell 实现而不是在 Scala 中编译?

Why does my implementation of Haskell snd not compile in 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

方法 reducereduceOption 需要具有元数 2 的函数,而不是采用元组的一元函数。

有区别

Function1[(X, Y), Z]

Function2[X, Y, Z]

第一个是一元的,取一个元组,第二个是二元的。同样适用于方法及其 eta 扩展。

此处按预期工作:

def twoArgSnd[T](a: Any, b: T): T = b 

list.reduceOption(twoArgSnd[Int])

还相关:

  1. Why is scala.collection.immutable.List[Object] not GenTraversableOnce[?]