Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 咖喱只是避免继承的一种方式吗?_Language Agnostic_Currying - Fatal编程技术网

Language agnostic 咖喱只是避免继承的一种方式吗?

Language agnostic 咖喱只是避免继承的一种方式吗?,language-agnostic,currying,Language Agnostic,Currying,因此,我对currying(基于So问题)的理解是,它允许您部分设置函数的参数,并返回一个“截断”函数作为结果 如果你有一个大的毛茸茸的函数需要10个参数 function (location, type, gender, jumpShot%, SSN, vegetarian, salary) { //weird stuff } 您需要一个“子集”函数,它可以让您处理除jumpShot%之外的所有预设,您不应该拆分一个从原始函数继承的类吗 我想我要寻找的是这个模式的一个用例。谢谢 在j

因此,我对currying(基于So问题)的理解是,它允许您部分设置函数的参数,并返回一个“截断”函数作为结果

如果你有一个大的毛茸茸的函数需要10个参数

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) {
    //weird stuff
}
您需要一个“子集”函数,它可以让您处理除
jumpShot%
之外的所有预设,您不应该拆分一个从原始函数继承的类吗


我想我要寻找的是这个模式的一个用例。谢谢

在javascript中,我对回调函数进行curry处理(因为在调用回调函数后(从调用方)无法向它们传递任何参数)

比如:

...
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 
}

我不确定这是否足够详细或连贯……但curry基本上允许您“预填充”参数并返回已填充数据的裸函数调用(而不是要求您在其他点填充该信息)

咖喱有很多用途。从简单地为经常使用的函数指定默认参数,到返回用于特定用途的专用函数

但让我举个例子:

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')

使用函数式编程时,通常会绑定参数以从旧代码生成新函数(在本例中为谓词)。伪代码:

filter(bind_second(greater_than, 5), some_list)
可能相当于:

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

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

在许多情况下,要忽略的参数在编译时是未知的,而在运行时是未知的。此外,对于给定函数可能存在的当前委托数没有限制.以下内容改编自真实世界的节目

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

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