`
alanwu
  • 浏览: 200543 次
  • 性别: 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 -> ...就为它提供了绑定。闭包跟变量的可变性没有关系。

相关推荐

    JS 柯里化(Currying)

    JavaScript中的柯里化(Currying)是一种函数编程技术,它允许我们将一个接受多个参数的函数转化为一系列接受单个参数的函数。这个过程是通过将原函数拆分成一系列嵌套的函数调用来实现的,每次调用只处理一个参数,...

    2015-01-18-JS柯里化(currying)1

    现在,我们希望创建一个`currying`函数,它可以接受`add`函数和初始参数,然后返回一个新的函数,这个新函数可以逐步接收剩余的参数。例如: ```javascript function currying(fn) { var args = Array.prototype....

    javascript的currying函数介绍

    一个带n个参数,curried的函数固化第一个参数为固定参数,并返回另一个带n-1个参数的函数对象,分别类似于LISP的原始函数car和cdr的行为。currying能泛化为偏函数应用(partial function application, PFA),p 这种函数...

    Higher-order functions for c++.zip

    在C++编程语言中,"Higher-order functions"(高阶函数)是一个重要的概念,它源自函数式编程领域。高阶函数是指可以接受一个或多个函数作为参数,或者返回一个新的函数作为结果的函数。这种特性使得C++代码更加灵活...

    Javascript闭包与函数柯里化浅析_.docx

    JavaScript中的闭包和函数柯里化是两种强大的编程技术,它们在函数式编程中起着核心作用。理解并熟练运用这两种技术,可以帮助开发者编写出更加高效、可维护的代码。 **闭包** 闭包是一种特殊的现象,它允许内部...

    Currying:用Javascript编写

    在JavaScript中,我们可以使用闭包和函数自身来实现Currying。下面是一个通用的Currying函数的实现: ```javascript function curry(fn) { const arity = fn.length; return function curried(...args) { if ...

    PyPI 官网下载 | jaraco.functools-1.16-py2.py3-none-any.whl

    1. **Partially Applied Functions**:在Python中,部分应用(Partial Application)是一种常见的函数组合技术,它可以提前固定函数的一部分参数,从而创建新的函数。`jaraco.functools`提供了一种更灵活的方式来...

    js代码-闭包&curry

    在JavaScript中,闭包和Currying(柯里化)是两个非常重要的概念,它们在函数式编程和模块化设计中发挥着关键作用。 闭包(Closure)是JavaScript的一个核心特性,它允许函数访问并操作其外部作用域中的变量,即使...

    javascript currying返回函数的函数

    更现代和推荐的做法是使用上面展示的`curried`函数内部的`argCount`和剩余参数处理逻辑。 总之,JavaScript中的柯里化是一种强大的技术,它增强了函数的灵活性和可重用性,同时使代码更易于理解和维护。通过利用...

    深化剖析JavaScript中的函数currying柯里化_.docx

    JavaScript中的函数柯里化(Currying)是一种将接受多个参数的函数转化为接受单一参数的函数序列的技术,每个函数返回一个新的函数,等待接收下一个参数。这一过程使得我们可以预先配置函数的一部分参数,然后在需要...

    curry:支持C ++中的Currying和函数组合

    诸如Haskell之类的函数式编程语言具有诸如currying,函数组成等功能。该库试图使用C ++ 14中可用的现代技术将此类功能引入C ++。 ####用法这是仅标头的库。 只需在源代码中包含文件fn.hpp。 主要功能“ fn”和相关...

    深化解析JavaScript中函数的Currying柯里化_.docx

    JavaScript中的柯里化(Currying)是一种将接受多个参数的函数转换为接受单个参数的函数的技术,每次只处理一个参数,并返回一个新的函数以处理剩余的参数。这种技术源自数学家哈斯凯尔·加德纳·柯里,因此得名。...

    详解JS中的柯里化(currying)

    JavaScript中的柯里化(Currying)是一种将接受多个参数的函数转换为接受单一参数的函数序列的技术,每个函数只接受一个参数并返回一个新的函数,直到所有参数都被传入并最终得到预期的结果。这一过程通常涉及函数的...

    Javascript闭包用法实例分析

    JavaScript 闭包是一种重要的编程概念,它涉及到函数和变量的作用域。闭包允许函数访问并操作在其外部定义的变量,即使在外部函数执行完毕后,这些变量仍然保持可访问状态。这种特性使得闭包在 JavaScript 中有着...

    Advanced-JavaScript-Functions:JavaScript功能(Avançado)

    "Advanced-JavaScript-Functions:JavaScript功能(Avançado)"这个主题深入探讨了JavaScript中的高级函数概念,这些概念对于提升代码质量和效率至关重要。下面将详细阐述JavaScript函数的一些核心知识点。 1. **...

    Swift中的函数柯里化 Function Currying

    Swift中的函数柯里化,是一种将多参数函数转化为一系列单参数函数的过程,使得函数...尽管在Swift中并不像其他一些语言那样内建支持,但我们依然可以通过闭包和函数组合来实现类似的功能,以提升代码的优雅性和功能性。

    js_functions:我的js_functions的注意事项

    闭包常用于实现私有变量和数据封装。 ```javascript function outer() { var privateVar = 'private'; function inner() { console.log(privateVar); } return inner; } var accessInner = outer(); ...

    Javascript闭包与函数柯里化浅析

    JavaScript中的闭包和函数柯里化是两种强大的技术,它们都是函数式编程的重要组成部分。闭包是一种机制,允许函数访问并操作其外部作用域的变量,即使在其定义的上下文之外。而函数柯里化是一种将多参数函数转换为一...

Global site tag (gtag.js) - Google Analytics