from:
http://hamletdarcy.blogspot.com/2008/01/curry-vs-closure-wrapping-in-groovy.html
这篇文章讲了使用curry来bind参数和使用闭包bind参数的一些区别, 觉得对理解curry和闭包不错, 简单的翻译了下
首先是一个例子:
def concat = { x, y ->
x + delegate.call() + y
}
concat.delegate = { " " }
assert concat("Hello", "World") == "Hello World"
注意delegate.call()的用法, 这里的delegate可以看成是一个变量, 可以随时在调用concat前进行修改, 比如用逗号, 分号来分隔
在大多数情况使用curry和使用闭包的效果是一样的.
比如在curry中可以这样写:
def hello = concat.curry("Hello")
assert hello("World") == "Hello World"
使用闭包可以这样写:
def hello = { x -> concat("Hello", x) }
assert hello("World") == "Hello World"
二者稍微有些区别, 在curry中定义的hello是CurriedClosure的实例, 而第二个hello是Closure的实例, 当然还有一个区别是curry绑定的参数是从左到右的(现在的rcurry, ncurry可以解决参数的顺序问题), 而使用闭包则相对灵活些.
这里我要说的是他们在对待delegate这个分隔符的区别.
对于curry, 效果是这样的:
def hello = concat.curry("Hello")
hello.delegate = { "," }
assert hello("World") == "Hello,World"
而对于闭包, 效果却是这样的:
def hello = { x -> concat("Hello", x) }
hello.delegate = { "," }
assert hello("World") == "Hello World"
出现不同的结果的解释是: 对于curry来说, 得到的CurriedClosure可以认为是对原有的concat闭包的一个继承, 因此得到的hello可以使用delegate, 而对于闭包来说, 是使用了一个新的闭包hello来包装了concat闭包, 因此hello就无法获取contat的delegate了
分享到:
相关推荐
ERP采集系统curry7中文操作手册
js代码-闭包&curry
闭包和柯里化都是JavaScript经常用到而且比较高级的技巧,所有的函数式编程语言都支持这两个概念,因此,我们想要充分发挥出JavaScript中的函数式编程特征,就需要深入的了解这两个概念,闭包事实上更是柯里化所不可...
Curry 基于RPC的面向服务的轻量级框架
curry, 简单的curry模块,无 *too clever*,完全测试覆盖 CURRYcurry函数没有任何的 ( 。 因为饥饿是fine的 为什么如果你不知道 currying,或者不是 sold awesomeness awesomeness,也许友好的博客文章帮助你。 API ...
概念往往都是干涩且难懂的,让我们用人话来解释就是:如果我们不确定这个函数有多少个参数,我们可以先给它传入一个参数,然后通过JS闭包(如若不懂JS闭包,请先学习闭包知识点再来学习本篇博文https:
[SLFM 022] Combinatory Logic. Vol.1 - Curry, Feys, Craig (NH 1958)(T).djvu
负荷电流EEGLAB功能可导入Computedics Neuroscan Curry数据文件(版本6、7、8和9)。安装要使用这些功能,请单击右侧的“克隆或下载”按钮,然后选择“下载ZIP”。 下载文件后,解压缩软件包,然后将loadcurryX.X...
它将给定的表达式和参数包装到一个解析值的新函数中。 安装及使用 需要 使用创建软件包: composer require nunomaduro/curryable 最好通过框架中的示例来描述这种辅助用法: 路由时 Route :: get ( '/' , curry...
import curry from 'super-curry' const linear = curry ( ( a , x , b ) => a * x + b ) // it can be called normally console . info ( linear ( 2 , 6 , 3 ) ) // 2 * 6 + 3 = 15 // with simple partial ...
Curry Howard Isomorphism
如果该参数为'+'或'add' ,则返回一个函数,该函数采用单个参数,该参数返回用于calculate的参数和要返回的最后一个函数的参数之和 如果该参数是'-'或'subtract' ,则返回一个函数,该函数采用单个参数,该参数返回...
如果该参数为'+'或'add' ,则返回一个函数,该函数采用单个参数,该参数返回用于calculate的参数和要返回的最后一个函数的参数之和如果该参数是'-'或'subtract' ,则返回一个函数,该函数采用单个参数,该参数返回...
如果该参数为'+'或'add' ,则返回一个函数,该函数采用单个参数,该参数返回用于calculate的参数和要返回的最后一个函数的参数之和 如果该参数是'-'或'subtract' ,则返回一个函数,该函数采用单个参数,该参数返回...
如果该参数为'+'或'add' ,则返回一个函数,该函数采用单个参数,该参数返回用于calculate的参数和要返回的最后一个函数的参数之和 如果该参数是'-'或'subtract' ,则返回一个函数,该函数采用单个参数,该参数返回...
如果需要,日期,时间和天气预报也可以显示在Stephen Curry的新标签上。 最后,您可以免费享受所有这些功能(还会在您的请求中添加更多功能)! 我们的Stephen Curry扩展程序不包含广告或任何隐藏的功能! ★对NBA ...
###在C ++中支持Curry和函数组合 ####这是什么? 诸如Haskell之类的函数式编程语言具有诸如currying,函数组成等功能。该库试图使用C ++ 14中可用的现代技术将此类功能引入C ++。 ####用法这是仅标头的库。 只...