- 💭 写在前面:本章我们将继续讲解函数式语言,介绍多参数,着重讲解柯里化的概念,将多参数函数实现为返回一个函数的函数。
目录
0x00 多参数(Multiple Arguments)
0x01 柯里化(Currying)
0x00 多参数(Multiple Arguments)
我们可以定义一个带有多个参数的函数吗?比如一个将两个整数参数相加的函数。
事实上,这在我们的 F- 语言中已经是可能的了。
在下面的代码中,函数 f 被定义为接受参数 x 并返回一个函数:(fun y -> x + y)
然后 f 3 2 被解释为 (f 3) 应用到 2
事实上,如果你在 F# 代码中写 let f x y = x + y,它在内部也是这样处理的:
// let f x y = x + y 可以这么写
let f = fun x -> (fun y -> x + y) in
f 3 2 // 把它想成 (f 3) 2
刚才那个概念,我们称之为 柯里化 (currying) ,将多参数函数实现为返回一个函数的函数。
柯里化使得函数的部分应用成为可能,例如我们可以定义如下的函数 inc,
它接受一个整数并返回增加 1 的整数,这在原版的 F# 语言和我们的 F- 语言中都是可能的。
let f = fun x -> (fun y -> x + y) in
let inc = f 1 in
let a = inc 7 // a 将被定义为 8
...
0x01 柯里化(Currying)
"优雅而灵巧的函数转换技术"
柯里化 (currying) 是一种函数式编程技术,它将一个接受多个参数的函数转换为一系列只接受一个参数的函数。这种技术以逻辑学家 Haskell Curry 的名字命名,尽管他并不是第一个提出这个概念的人。
在传统的多参数函数中,函数一次性接收所有参数并返回结果。例如,有一个函数 f(x, y, z)
:
def f(x, y, z):
return x + y + z
通过 currying,可以将这个函数转换为一系列接受单一参数的函数:
def curried_f(x):
def g(y):
def h(z):
return x + y + z
return h
return g
# 调用方法
result = curried_f(1)(2)(3) # result 为 6
优点:
① 部分应用 Currying 可以方便地固定某些参数,从而生成一个新函数。例如:
add_to_five = curried_f(5)
result = add_to_five(2)(3) # result 为 10
② 函数组合: Currying 支持更灵活的函数组合和重用,使得编写高阶函数变得更加简单。
③ 代码简洁性: 在某些情况下,currying 可以使代码更简洁、更具可读性。
许多函数式编程语言原生支持 currying。
在 JavaScript 中我们也可以手动实现,或者使用 Lodash 库的内置函数:
function curriedAdd(x) {
return function(y) {
return function(z) {
return x + y + z;
};
};
}
const addToFive = curriedAdd(5);
const result = addToFive(3)(2); // result 为 10
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2024.6.10
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . |