【发布时间】:2015-08-26 08:49:52
【问题描述】:
我发现了一些关于什么是咖喱以及它可以做什么的好帖子。它可以将带有参数列表的函数转换为函数列表。我不清楚这在什么情况下有用。谁能给我一个具体的例子吗?
【问题讨论】:
-
就 Scala 而言,it helps with type inference (and more)(参见:所有
folds 的实现)
我发现了一些关于什么是咖喱以及它可以做什么的好帖子。它可以将带有参数列表的函数转换为函数列表。我不清楚这在什么情况下有用。谁能给我一个具体的例子吗?
【问题讨论】:
folds 的实现)
Currying 不会将具有参数列表的函数转换为函数列表。它将一个具有多个参数的函数转换为一个接受一个参数的函数,并递归地返回一个接受其余参数的函数。例如:
scala> def f(x: Int, y: Int, z:Int) = x + y + z
ff: (x: Int, y: Int, z: Int)Int
scala> (f _).curried
res4: Int => (Int => (Int => Int)) = <function1>
第一个函数有 3 个参数。第二个函数接受一个参数,并返回一个接受另一个参数的函数,它接受一个 int 并返回所有三个的总和。
为什么这在实践中很有用?它有助于创建函数对象,而无需编写闭包。考虑一个函数f(pat, dir),它在目录中查找与模式匹配的文件。现在您想在列表dirs 中存储的多个目录中查找相同的模式。你可以使用
val ff = (f _).curried
dirs.map(ff(pat))
【讨论】: