`
alanwu
  • 浏览: 197772 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Currying,闭包, Partially applied functions和Curried functions的区别

阅读更多
这几个名字什么概念?以前不知其解,现在有一些理解不知道对不对,请大家讨论一下

Currying:Currying是为了纪念美帝数学家Haskell Brooks Curry而命名的,所以想翻译成中文估计最好是音译了。它的基础是λ演算。
在计算机语言就是一个函数可以带多个参数列表,注意是多个参数列表,而不是多个参数。如def foo(x: Int)(y: Int)(z: Int){}。
这是一种能力表述,对应的函数称之为Curried function。但是Scala骨子里不是函数式语言,它是用OO实现的,而且是建立在JAVA虚拟机上,
于是Scala就提出了 Partially applied function,我的理解他就是Scala的Curried function的实现方式,而且创新性的提出Partially Function,其实它对应的还是一个OO的Class或对象。Partially Function应该翻译成偏函数,caoyuan同时提出这样翻译是有数学背景的。但是纯的函数式语言没有这个概念是因为它能很自然的实现 Curried function。


再剩下闭包,在编程语言闭包有两个讲述方式,1是匿名函数,2是带有自由(未绑定)变量的函数块。
这两个表述方式根据不同的编程语言略有不同,在Scala应该是后者包含前者。也就是说如果这个函数块没有名字,那么它就是匿名函数,如果有那它还是闭包但不是匿名函数。
Python3.0之前支持匿名函数但不能真正处理闭包。

将了半天闭包还没点到它的实质,我对闭包的理解是:闭包是OO的产物,是OO对函数式编程λ演算的一种变形实现。
为什么这么说呢?
首先闭包不是函数式的:函数式是没有变量一说的,那么从闭包的概念可以得知闭包是为了处理自由变量而提出的,既然连变量都没有就更谈不上闭包。
第二OO是不支持只传递运算的:OO的思想核心是对象,传递的全是对象,但运算函数不是对象,他只是对象的一部分。但现实有只传递运算的需求,于是就需要创造,就出了闭包。

以上是我对这些概念的理解,没有在哪本书或哪篇文章找到过相应的论述,恐有理解偏差还请大家多多包涵。



--
Scala中文社区:  http://groups.google.com/group/scalacn
1
0
分享到:
评论
2 楼 agile_boy 2010-01-14  
currying,partial function 主要是语法上的差异和FP使用的差异吧,其功能是相同的吧?
1 楼 ravenex 2009-12-02  
楼主大大的理解好像都不太对呀

currying,partial function application,closure这些都跟OO没有必然联系。
currying是把一个多参数的函数转换成多个单参数函数的过程
partial function application是对一个多参数的函数调用,但只传入部分需要的参数,得到的是接受剩余参数的函数
closure的关键点是要捕获自由变量

closure跟OO有共通点,OO的对象的域相对使用它们的方法就是自由变量。但closure绝对不是OO的产物。看
add = 
  \x ->
    \y ->
      x + y

main = do
  putStrLn $ show $ add 1 2

虽然Haskell没有“变”量,但在lambda表达式:\y -> x + y里,x仍然是未绑定的,而外面的\x -> ...就为它提供了绑定。闭包跟变量的可变性没有关系。

相关推荐

Global site tag (gtag.js) - Google Analytics