scala - 为什么 Scala 提供多个参数列表和每个列表多个参数?

标签 scala currying partial-application

多个参数列表,例如def foo(a:Int)(b:Int) = {}每个列表有多个参数,例如def foo(a:Int, b:Int) = {}据我所知,它们在语义上是等效的,并且大多数函数式语言只有一种声明多个参数的方法,例如F#。

我能想到支持这两种风格的函数定义的唯一原因是允许使用仅包含一个参数的参数列表进行类似语法的语言扩展。

def withBufferedWriter(file: File)(block: BufferedWriter => Unit)

现在可以使用语法外观来调用

withBufferedWriter(new File("myfile.txt")) { out =>
  out write "whatever"
  ...
}

但是,可能还有其他方法支持使用大括号而不需要多个参数列表。

一个相关问题:为什么在 Scala 中使用多个参数列表被称为“柯里化(Currying)”?柯里化(Currying)通常被定义为一种为了支持部分应用而将 n 元函数变为一元的技术。然而,在 Scala 中,人们可以部分应用函数,而无需制作该函数的“柯里化(Currying)”(多个参数列表,每个参数一个参数)版本。

最佳答案

它使您能够执行以下操作:

scala> def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
foo: (as: Int*)(bs: Int*)(cs: Int*)Int

scala> foo(1, 2, 3)(4, 5, 6, 7, 9)(10, 11)
res7: Int = 3906

关于scala - 为什么 Scala 提供多个参数列表和每个列表多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4684185/

相关文章:

java - Scala(或Java)中泛型函数的特化

scala - 如何在 scala 中创建 curried 匿名函数?

javascript - 我可以让这个函数定义更短吗?

Haskell:了解部分应用程序吗?

c# - 替换 lambda 表达式中的参数

java - 单击按钮后强制重绘

Scala 泛型类型推断与 ClassTag 不一致

scala - 使用 scala 宏表达式创建类似 Haskell 的 where 构造

scala - 部分应用的递归函数

python - 动态添加内置方法以指向属性的内置方法