我是Scala的新手,最近还在学习Currying。我知道什么是currying和部分应用的功能。但我不明白为什么要使用Currying而不是多个参数。那么任何身体都可以帮助我提供一些例如讨好。
答案 0 :(得分:2)
假设通过" currying"你的意思是具有多个参数列表的函数定义,两个最重要的优点是:
更好的类型推断:先前参数列表中的参数类型可用于后续参数列表中参数的类型推断。这有效:
def delta[A](x: A)(f: A => A): A = f(x)
delta(5)(x => x)
但这里没有:
def foo[A](x: A, f: A => A): A = f(x)
foo(5, x => x) // error: missing parameter type
最突出的例子可能是fold
列表:
val a = List(1, 2, 3)
a.foldLeft("List:"){ (s, i) => s + " " + i }
在此示例中,无需将类型归于s
和i
。
您可以使用先前参数列表中的变量来定义默认参数:
def f(x: Int)(y: Int, z: Int = x * x) = x + y * z // valid
f(2)(3) // works
def g(x: Int, y: Int, z: Int = x * x) = x + y * z // invalid
通过"部分应用的功能",通常意味着这样的事情:
List(83,223,314,56,79).map(math.min(100, _))
// output: List(83, 100, 100, 56, 79)
此处,数学函数min
首先用于创建部分应用的函数min(100, _)
,然后将其传递给map
以截断列表中大于100的所有数字。 / p>
如果您的意思是"部分应用curried函数",那么这里是一个带有curried函数的相同示例:
def min(x: Int)(y: Int) = x min y
List(83,223,314,56,79).map(min(100))
正如您所看到的,咖喱版本比通常的"部分应用函数更简洁,更简洁。" -version。
我不确定该怎么说"优点"部分应用的功能,除了你可以使用它们,并且不能使用它们是痛苦的。