Scala 为什么使用多个参数列表定义折叠?

Scala 为什么使用多个参数列表定义折叠?,scala,fold,Scala,Fold,我试图找出在Scala中使用括号的押韵或原因,特别是使用fold方法: val sum = prices.fold(0.0)(_ + _) 为什么会这样?Scala通常似乎不遵循FP格式(方法调用上没有括号),但它确实遵循了FP格式。。。除了它还需要单项累加器之间的括号外?为什么两者都不是 val sum = prices.fold((0.0), (_ + _)) 或 ? 是使用多参数列表定义的,可能是由于Jörg W Mittag建议的类型推断原因 def fold[A1 >: A]

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

val sum = prices.fold(0.0)(_ + _)
为什么会这样?Scala通常似乎不遵循FP格式(方法调用上没有括号),但它确实遵循了FP格式。。。除了它还需要单项累加器之间的括号外?为什么两者都不是

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

?

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

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
另一方面,例如,使用单个参数列表定义

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

Scala允许多个参数列表。围绕函数调用的偏执不是FP标准。如果我理解正确,它来自LISP/Scheme,以及这些语言中几乎所有东西都是s表达式这一事实。Fold是这样实现的(在几乎任何语言中),因为它是列表上的一种变形。从而将lambda和不动点分开。(当我不在拥挤的火车上时,我会给出更详细的答案)。只是从历史上看,他们都是这样表现的。真正的答案是有人在那天就决定了。它可能是您发布的最后一个synthax或第二个(尽管我觉得这一个令人困惑)@sinanspd我的意思是FP标准没有括号,Scala似乎一般不遵循这一点。这似乎是Jasper-m提到的“多参数列表”,但我还不清楚为什么会出现这些列表,或者在这里使用这些列表。Jasper提到的内容在这里简要介绍:“给定参数列表中的所有参数都有助于同时推断类型参数。然后,在解释下一个参数列表时,这些结论被用作前提。”实际上,类型推断只在参数列表之间流动,而不是在,这意味着通常必须提供显式类型注释。
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