这几个名字什么概念?以前不知其解,现在有一些理解不知道对不对,
请大家讨论一下。
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
分享到:
相关推荐
一个带n个参数,curried的函数固化第一个参数为固定参数,并返回另一个带n-1个参数的函数对象,分别类似于LISP的原始函数car和cdr的行为。currying能泛化为偏函数应用(partial function application, PFA),p 这种函数...
You will learn concepts such as currying, partial functions, higher-order functions, and monads. Programming languages have evolved from focusing on procedures to objects and now on function. ...
诸如Haskell之类的函数式编程语言具有诸如currying,函数组成等功能。该库试图使用C ++ 14中可用的现代技术将此类功能引入C ++。 ####用法这是仅标头的库。 只需在源代码中包含文件fn.hpp。 主要功能“ fn”和相关...
Swift的各种特性已经被很多人研究过,但有一个特性只有较少人提及,那就是函数柯里化(Function Currying)。苹果在Swift Language Guide没有添加任何关于柯里化函数的信息,只在Swift Language Reference对它简单...
深化解析JavaScript中函数的Currying柯里化_.docx
深化剖析JavaScript中的函数currying柯里化_.docx
currying函数是一种返回函数的函数,是闭包最伟大的应用之一。有关闭包更详细的定义可参见这里与这里。如下currying函数的一种定义。
主要介绍了JS中的柯里化(currying),需要的朋友可以参考下
kari.hpp是C 14中的一个柯里化(Currying)实验库
咖喱快捷的咖喱和无咖喱味功能curry ( + )( 1 )( 2 )uncurry ( curry ( * ))( 2 , 2 ) == 4代码贡献可以通过fork / pull请求为master分支做出贡献。 如果您要请求功能或报告错误,请重新发行一本。
NULL 博文链接:https://onestopweb.iteye.com/blog/2361363
Scala is used to construct elegant class hierarchies for maximum code reuse and extensibility and to implement their behavior using higher-order functions. Its functional programming (FP) features are...
概念往往都是干涩且难懂的,让我们用人话来解释就是:如果我们不确定这个函数有多少个参数,我们可以先给它传入一个参数,然后通过JS闭包(如若不懂JS闭包,请先学习闭包知识点再来学习本篇博文https:
currying-java 用Java咖喱
主要介绍了JavaScript中函数的Currying柯里化,Currying 的重要意义在于可以把函数完全变成"接受一个参数、返回一个值"的固定形式,需要的朋友可以参考下
咖喱部分演示node.js中的currying和部分函数应用程序我正在使用此存储库来尝试使用咖喱函数和部分应用的函数quokkaTestGround.js与vsCode中的Quokka.js扩展一起使用
咖喱 用Java编写Currying的一些示例。 ## Install要安装,请克隆存储库,然后: 安装节点依赖项: npm install 运行gulp: gulp gulp watch
关于柯里化,可以参看wiki的介绍,但是有些绕,举一个例子,假如有如下函数:现在希望有另外一个函数,可以通过如下方式调用:简而言之,可以理解为目前有一个函数f,
This book begins with the rationale behind patterns to help you understand where and why each pattern is applied. You will discover what tail recursion brings to your table and will get an ...
You'll also get a thorough reference to the Underscore.js library and its idioms, including: Closures Applicative programming Laziness Immutability Higher-order functions Purity Combinators Currying ...