9

因此,我对柯里化(基于 SO 问题)的理解是,它可以让您部分设置函数的参数并返回“截断”函数作为结果。

如果你有一个大毛函数需要 10 个参数,看起来像

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

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

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

4

4 回答 4

5

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

但是让我给你这个例子:

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')
于 2010-04-27T23:24:00.950 回答
1

在javascript中,我对回调函数进行了currying(因为它们在被调用后不能传递任何参数(来自调用者)

所以像:

...
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基本上可以让你“预填充”参数并返回一个已经填充数据的裸函数调用(而不是要求你在其他点填充该信息)

于 2010-04-27T23:23:56.220 回答
1

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

filter(bind_second(greater_than, 5), some_list)

可能相当于:

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

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

于 2010-04-28T00:28:34.123 回答
0

在许多情况下,要省略的参数在编译时并不知道,而是在运行时才知道。此外,对于给定函数,可能存在的柯里化委托的数量没有限制。以下内容改编自真实世界的程序。

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

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

于 2010-12-23T02:32:31.747 回答