多个参数列表,例如def foo(a:Int)(b:Int) = {}每个列表的多个参数,例如def foo(a:Int, b:Int) = {},就我所知,在语义上是等效的,并且大多数函数语言只有一种方式来声明多个参数,例如F#.
我可以找到支持这两种函数定义样式的唯一原因是允许使用只有一个参数的参数列表进行类似语法的语言扩展.
def withBufferedWriter(file: File)(block: BufferedWriter => Unit)
Run Code Online (Sandbox Code Playgroud)
现在可以使用syntax-looking调用
withBufferedWriter(new File("myfile.txt")) { out =>
out write "whatever"
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果没有多个参数列表,可能还有其他方法可以支持花括号的使用.
一个相关的问题:为什么在Scala中使用多个参数列表称为"currying"?Currying通常被定义为为了支持部分应用而使n-ary函数一元化的技术.但是,在Scala中,可以部分应用函数,而不会使函数的"curried"(多个参数列表,每个参数列表).
我试图理解多个参数子句的这种语言特性以及为什么要使用它.例如,这两个功能之间的区别是什么?
class WTF {
def TwoParamClauses(x : Int)(y: Int) = x + y
def OneParamClause(x: Int, y : Int) = x + y
}
>> val underTest = new WTF
>> underTest.TwoParamClauses(1)(1) // result is '2'
>> underTest.OneParamClause(1,1) // result is '2'
Run Code Online (Sandbox Code Playgroud)
在第4.6点的Scala规范中有一些内容.看看这对你有意义.
注意:规范称这些'参数子句',但我认为有些人也可能称之为'参数列表'.
我正在阅读 Scala 3 文档。他们引入了given关键字,被认为是 Scala 2 的替代品implicit。代码在这里
trait Ord[T] {
def compare(x: T, y: T): Int
def (x: T) < (y: T) = compare(x, y) < 0
def (x: T) > (y: T) = compare(x, y) > 0
}
given intOrd: Ord[Int] {
def compare(x: Int, y: Int) =
if (x < y) -1 else if (x > y) +1 else 0
}
given listOrd[T]: (ord: Ord[T]) => Ord[List[T]] {
def compare(xs: List[T], ys: List[T]): Int …Run Code Online (Sandbox Code Playgroud)