关闭

函数加里化和偏函数应用的比较

发表于:2013-4-18 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  【名词解释】Currying:因为是美国数理逻辑学家哈斯凯尔·加里(Haskell Curry)发明了这种函数使用技巧,所以这样用法就以他的名字命名为Currying,中文翻译为“加里化”。

  我感觉很多人都对函数加里化(Currying)和偏函数应用(Partial Application)之间的区别搞不清楚,尤其是在相似的上下文环境中它们同时出现的时候。

  偏函数解决这样的问题:如果我们有函数是多个参数的,我们希望能固定其中某几个参数的值。

  几乎所有编程语言中都有非常明显的偏函数应用。在C语言中:

  1. int foo(int a, int b, int c) {  
  2.   return a + b + c;  
  3. }  
  4. int foo23(int a, int c) {  
  5.   return foo(a, 23, c);  
  6. }

  foo23函数实际上就是一个foo函数的偏函数应用,参数b的值被固定为23。

  当然,像这样明显的偏函数并没有太大的用处;我们通常会希望编程语言能提供我们某些偏函数特征。

  例如,在Python语言中,我们可以这样做:

  1. from functools import partial  
  2. def foo(a,b,c):  
  3.   return a + b + c  
  4. foo23 = partial(foo, b=23)  
  5. foo23(a = 1, c = 3)  # => 27

  函数加里化(Currying)明显解决的是一个完全不同的问题:如果我们有几个单参数函数,并且这是一种支持一等函数(first-class)的语言,如何去实现一个多参数函数?函数加里化是一种实现多参数函数的方法。

  下面是一个单参数的Javascript函数:

  1. var foo = function(a) {  
  2.   return a * a;  
  3. }

  如果我们受限只能写单参数函数,可以像下面这样模拟出一个多参数函数:

  1. var foo = function(a) {  
  2.   return function(b) {  
  3.     return a * a + b * b;  
  4.   }  
  5. }

  通过这样调用它:(foo(3))(4),或直接 foo(3)(4)。

  注意,函数加里化提供了一种非常自然的方式来实现某些偏函数应用。如果你希望函数foo的第一个参数值被固定成5,你需要做的就是var foo5 = foo(5)。这就OK了。函数foo5就是foo函数的偏函数。注意,尽管如此,我们没有很简单的方法对foo函数的第二个参数偏函数化(除非先偏函数化第一个参数)。

  当然,Javascript是支持多参数函数的:

  1. var bar = function(a, b) {  
  2.   return a * a + b * b;  
  3. }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号