首页 > 解决方案 > 为什么我的 Haskell snd 实现不能在 Scala 中编译?

问题描述

我按照 Haskell snd定义了以下函数

def snd[T](pair: (_, T)): T = pair._2

尝试将它与 a 一起使用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

标签: scalatuplesarity

解决方案


具有 arity 的方法reducereduceOptionrequire 函数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[?]

推荐阅读