currying只是一种避免继承的方法吗?

时间:2010-04-27 23:18:17

标签: language-agnostic currying

所以我对currying的理解(基于SO问题)是它允许你部分设置函数的参数并返回一个“截断”函数。

如果你有一个大毛茸茸的功能需要10个参数,看起来像

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) {
    //weird stuff
}

并且你想要一个“子集”函数,它可以让你处理除jumpShot%之外的所有预设,不应该只是打破一个继承原始函数的类吗?

我想我正在寻找的是这种模式的用例。谢谢!

4 个答案:

答案 0 :(得分:5)

Currying有很多用途。从简单地指定您经常使用的函数的默认参数到返回用于特定目的的专用函数。

但是让我举个例子:

function log_message(log_level, message){}
log_error = curry(log_message, ERROR)
log_warning = curry(log_message, WARNING)

log_message(WARNING, 'This would be a warning')
log_warning('This would also be a warning')

答案 1 :(得分:1)

在javascript中我对回调函数进行了讨论(因为它们在被调用后无法传递任何参数(来自调用者)

类似于:

...
var test = "something specifically set in this function";
onSuccess: this.returnCallback.curry(test).bind(this),

// This will fail (because this would pass the var and possibly change it should the function be run elsewhere
onSuccess: this.returnCallback.bind(this,test),
...

// this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry
returnCallback: function(thePassedVar, ajaxResponse){
   // now in here i can have 'thePassedVar', if 
}

我不确定这是否足够详细或连贯......但是currying基本上允许你'预填充'参数并返回已经填充数据的裸函数调用(而不是要求你在某些地方填写该信息)其他观点)

答案 2 :(得分:1)

在以函数样式编程时,通常会绑定参数以生成旧函数(在此示例中为谓词)。伪代码:

filter(bind_second(greater_than, 5), some_list)

可能相当于:

filter({x : x > 5}, some_list)

其中{x : x > 5}是匿名函数定义。也就是说,它构造了some_list中大于5的所有值的列表。

答案 3 :(得分:0)

在许多情况下,要省略的参数在编译时不会知道,而是在运行时知道。此外,对于给定功能可能存在的curried委托的数量没有限制。以下内容改编自现实世界的计划。

我有一个系统,我将命令包发送到远程机器并接收反馈数据包。每个命令包都有一个索引号,每个回复都带有它作为响应的命令的索引号。翻译成英文的典型命令可能是“从地址0x12300开始给我128个字节”。典型的反应可能是“成功”。以及128字节的数据。

为了处理通信,我有一个例程,它接受许多命令包,每个命令包都有一个委托。收到每个响应后,将对接收的数据运行相应的委托。与上面命令相关联的委托将类似于“确认我获得了128字节数据的'成功',如果是,则将它们存储到地址为0x12300的缓冲区中”。请注意,在任何给定时间,多个数据包可能是未完成的curried地址参数是例程知道传入数据应该去的地方所必需的。即使我想写一个“存储数据到缓冲区”例程,它不需要地址参数,也无法知道传入数据应该去哪里。