什么场景柯里化在 Scala 中有用?
What scenario currying is useful in scala?
我发现了一些关于咖喱是什么以及它能做什么的好帖子。它可以将带有参数列表的函数转换为函数列表。我不清楚这在什么情况下有用。谁能给我一个具体的例子吗?
Scala currying vs partially applied functions
柯里化不会将具有参数列表的函数转换为函数列表。它将具有多个参数的函数递归地转换为接受一个参数的函数和 returns 接受其余参数的函数。例如:
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 个参数。第二个函数接受一个参数,returns 一个接受另一个参数的函数,它接受一个 int 和 returns 三者之和。
为什么这在实践中有用?它有助于创建函数对象而无需编写闭包。考虑一个函数 f(pat, dir)
,它在目录中查找与模式匹配的文件。现在您想在列表 dirs
中存储的多个目录中查找相同的模式。您可以使用
val ff = (f _).curried
dirs.map(ff(pat))
我发现了一些关于咖喱是什么以及它能做什么的好帖子。它可以将带有参数列表的函数转换为函数列表。我不清楚这在什么情况下有用。谁能给我一个具体的例子吗?
Scala currying vs partially applied functions
柯里化不会将具有参数列表的函数转换为函数列表。它将具有多个参数的函数递归地转换为接受一个参数的函数和 returns 接受其余参数的函数。例如:
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 个参数。第二个函数接受一个参数,returns 一个接受另一个参数的函数,它接受一个 int 和 returns 三者之和。
为什么这在实践中有用?它有助于创建函数对象而无需编写闭包。考虑一个函数 f(pat, dir)
,它在目录中查找与模式匹配的文件。现在您想在列表 dirs
中存储的多个目录中查找相同的模式。您可以使用
val ff = (f _).curried
dirs.map(ff(pat))