这几个名字什么概念?以前不知其解,现在有一些理解不知道对不对,
请大家讨论一下。
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
分享到:
相关推荐
JavaScript中的柯里化(Currying)是一种函数编程技术,它允许我们将一个接受多个参数的函数转化为一系列接受单个参数的函数。这个过程是通过将原函数拆分成一系列嵌套的函数调用来实现的,每次调用只处理一个参数,...
现在,我们希望创建一个`currying`函数,它可以接受`add`函数和初始参数,然后返回一个新的函数,这个新函数可以逐步接收剩余的参数。例如: ```javascript function currying(fn) { var args = Array.prototype....
一个带n个参数,curried的函数固化第一个参数为固定参数,并返回另一个带n-1个参数的函数对象,分别类似于LISP的原始函数car和cdr的行为。currying能泛化为偏函数应用(partial function application, PFA),p 这种函数...
在C++编程语言中,"Higher-order functions"(高阶函数)是一个重要的概念,它源自函数式编程领域。高阶函数是指可以接受一个或多个函数作为参数,或者返回一个新的函数作为结果的函数。这种特性使得C++代码更加灵活...
JavaScript中的闭包和函数柯里化是两种强大的编程技术,它们在函数式编程中起着核心作用。理解并熟练运用这两种技术,可以帮助开发者编写出更加高效、可维护的代码。 **闭包** 闭包是一种特殊的现象,它允许内部...
在JavaScript中,我们可以使用闭包和函数自身来实现Currying。下面是一个通用的Currying函数的实现: ```javascript function curry(fn) { const arity = fn.length; return function curried(...args) { if ...
1. **Partially Applied Functions**:在Python中,部分应用(Partial Application)是一种常见的函数组合技术,它可以提前固定函数的一部分参数,从而创建新的函数。`jaraco.functools`提供了一种更灵活的方式来...
在JavaScript中,闭包和Currying(柯里化)是两个非常重要的概念,它们在函数式编程和模块化设计中发挥着关键作用。 闭包(Closure)是JavaScript的一个核心特性,它允许函数访问并操作其外部作用域中的变量,即使...
更现代和推荐的做法是使用上面展示的`curried`函数内部的`argCount`和剩余参数处理逻辑。 总之,JavaScript中的柯里化是一种强大的技术,它增强了函数的灵活性和可重用性,同时使代码更易于理解和维护。通过利用...
JavaScript中的函数柯里化(Currying)是一种将接受多个参数的函数转化为接受单一参数的函数序列的技术,每个函数返回一个新的函数,等待接收下一个参数。这一过程使得我们可以预先配置函数的一部分参数,然后在需要...
诸如Haskell之类的函数式编程语言具有诸如currying,函数组成等功能。该库试图使用C ++ 14中可用的现代技术将此类功能引入C ++。 ####用法这是仅标头的库。 只需在源代码中包含文件fn.hpp。 主要功能“ fn”和相关...
JavaScript中的柯里化(Currying)是一种将接受多个参数的函数转换为接受单个参数的函数的技术,每次只处理一个参数,并返回一个新的函数以处理剩余的参数。这种技术源自数学家哈斯凯尔·加德纳·柯里,因此得名。...
JavaScript中的柯里化(Currying)是一种将接受多个参数的函数转换为接受单一参数的函数序列的技术,每个函数只接受一个参数并返回一个新的函数,直到所有参数都被传入并最终得到预期的结果。这一过程通常涉及函数的...
JavaScript 闭包是一种重要的编程概念,它涉及到函数和变量的作用域。闭包允许函数访问并操作在其外部定义的变量,即使在外部函数执行完毕后,这些变量仍然保持可访问状态。这种特性使得闭包在 JavaScript 中有着...
"Advanced-JavaScript-Functions:JavaScript功能(Avançado)"这个主题深入探讨了JavaScript中的高级函数概念,这些概念对于提升代码质量和效率至关重要。下面将详细阐述JavaScript函数的一些核心知识点。 1. **...
Swift中的函数柯里化,是一种将多参数函数转化为一系列单参数函数的过程,使得函数...尽管在Swift中并不像其他一些语言那样内建支持,但我们依然可以通过闭包和函数组合来实现类似的功能,以提升代码的优雅性和功能性。
闭包常用于实现私有变量和数据封装。 ```javascript function outer() { var privateVar = 'private'; function inner() { console.log(privateVar); } return inner; } var accessInner = outer(); ...
JavaScript中的闭包和函数柯里化是两种强大的技术,它们都是函数式编程的重要组成部分。闭包是一种机制,允许函数访问并操作其外部作用域的变量,即使在其定义的上下文之外。而函数柯里化是一种将多参数函数转换为一...