函数加里化和偏函数应用的比较
作者:网络转载 发布时间:[ 2013/4/18 11:35:46 ] 推荐标签:
【名词解释】Currying:因为是美国数理逻辑学家哈斯凯尔·加里(Haskell Curry)发明了这种函数使用技巧,所以这样用法以他的名字命名为Currying,中文翻译为“加里化”。
我感觉很多人都对函数加里化(Currying)和偏函数应用(Partial Application)之间的区别搞不清楚,尤其是在相似的上下文环境中它们同时出现的时候。
偏函数解决这样的问题:如果我们有函数是多个参数的,我们希望能固定其中某几个参数的值。
几乎所有编程语言中都有非常明显的偏函数应用。在C语言中:
int foo(int a, int b, int c) {
return a + b + c;
}
int foo23(int a, int c) {
return foo(a, 23, c);
}
foo23函数实际上是一个foo函数的偏函数应用,参数b的值被固定为23。
当然,像这样明显的偏函数并没有太大的用处;我们通常会希望编程语言能提供我们某些偏函数特征。
例如,在Python语言中,我们可以这样做:
from functools import partial
def foo(a,b,c):
return a + b + c
foo23 = partial(foo, b=23)
foo23(a = 1, c = 3) # => 27
函数加里化(Currying)明显解决的是一个完全不同的问题:如果我们有几个单参数函数,并且这是一种支持一等函数(first-class)的语言,如何去实现一个多参数函数?函数加里化是一种实现多参数函数的方法。
下面是一个单参数的Javascript函数:
var foo = function(a) {
return a * a;
}
如果我们受限只能写单参数函数,可以像下面这样模拟出一个多参数函数:
var foo = function(a) {
return function(b) {
return a * a + b * b;
}
}
通过这样调用它:(foo(3))(4),或直接 foo(3)(4)。
注意,函数加里化提供了一种非常自然的方式来实现某些偏函数应用。如果你希望函数foo的第一个参数值被固定成5,你需要做的是var foo5 = foo(5)。这OK了。函数foo5是foo函数的偏函数。注意,尽管如此,我们没有很简单的方法对foo函数的第二个参数偏函数化(除非先偏函数化第一个参数)。
当然,Javascript是支持多参数函数的:
var bar = function(a, b) {
return a * a + b * b;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11