首页 > 解决方案 > 为什么使用多个参数列表定义折叠?

问题描述

我试图找出在 Scala 中使用括号的押韵或原因,特别是使用 fold 方法:

val sum = prices.fold(0.0)(_ + _)

为什么会这样?Scala 似乎通常不遵循 FP 格式(方法调用上没有括号),但它确实......除了它还需要在单项累加器中加上括号?为什么也不是

val sum = prices.fold((0.0), (_ + _))

或者

val sum = prices.fold 0.0 (_ + _)

?

标签: scalafold

解决方案


IterableOnce.fold使用多个参数列表定义可能是由于 Jörg W Mittag 所建议的类型推断原因

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1

另一方面,例如,Either.fold使用单个参数列表定义

def fold[C](fa: A => C, fb: B => C): C

确认类型推断原因,请考虑以下示例

def zar[T](x: T)(f: (T, T) => T) = f(x, x)
def tar[T](x: T, f: (T, T) => T) = f(x, x)

zar(21)(_ + _)        // OK
tar(21, _ + _)        // Error: missing parameter type for expanded function 
tar[Int](21, _ + _)   // OK

tar请注意,当不使用多个参数列表时,我们必须如何显式指定类型参数。


推荐阅读