Interface 函数curry与普通回调方法

Interface 函数curry与普通回调方法,interface,callback,functional-programming,currying,Interface,Callback,Functional Programming,Currying,我试图理解被称为currying的编程技术与普通回调接口(如Java中的Observer/Observable接口或经典的Visitor设计模式)的区别 我理解什么是咖喱,我只是不明白为什么它特别有用,以至于它需要自己的术语和语言支持 有人能解释一种编程情况吗?这种情况通过curry比通过回调方法更好地解决?Curry为每个参数使用单独的函数这一事实的实际意义是什么 [更新:]总结一下我得到的答案:Curry的部分原因是函数是“一流”公民,即可以像任何其他对象引用一样创建和传递的对象。这使得从函

我试图理解被称为currying的编程技术与普通回调接口(如Java中的Observer/Observable接口或经典的Visitor设计模式)的区别

我理解什么是咖喱,我只是不明白为什么它特别有用,以至于它需要自己的术语和语言支持

有人能解释一种编程情况吗?这种情况通过curry比通过回调方法更好地解决?Curry为每个参数使用单独的函数这一事实的实际意义是什么

[更新:]总结一下我得到的答案:Curry的部分原因是函数是“一流”公民,即可以像任何其他对象引用一样创建和传递的对象。这使得从函数返回函数成为可能,换言之,是curry


至于咖喱之所以有用的原因,咖喱提供了一种语法,让您可以简洁地修饰函数调用,从而可以用最少的样板代码开销创建派生函数。在java中,您可能会为每个部分参数集创建几个重载或“包装器”方法,这些方法最终会调用包含所有参数的主方法,而Curry提供了一种更轻巧的语法,让您可以根据代码中的需要生成这些“函数包装器”。

这是语言支持的一个方面。 例如,在Java中,可以定义各种回调接口:一个用于无参数方法,一个用于有一个参数的方法,一个用于有两个参数的方法,等等

但是wehn函数是第一类Citizien函数,我们不需要这样做:单参数函数可以完成这项工作,因为函数可以返回。因此,所有“功能性java”项目中的一个重要接口将是以下形式的一些接口:

interface Fun<A,B> {
    public B apply(A a);
}
界面乐趣{
公共B申请(A);
}

或者类似的内容涵盖了这种模式。

好吧,这是语言支持的一个方面。 例如,在Java中,可以定义各种回调接口:一个用于无参数方法,一个用于有一个参数的方法,一个用于有两个参数的方法,等等

但是wehn函数是第一类Citizien函数,我们不需要这样做:单参数函数可以完成这项工作,因为函数可以返回。因此,所有“功能性java”项目中的一个重要接口将是以下形式的一些接口:

interface Fun<A,B> {
    public B apply(A a);
}
界面乐趣{
公共B申请(A);
}

或者类似的技术涵盖了这种模式。

咖喱和回调是两种完全不同的技术

回调本质上是“将函数传递给函数”(即使用函数的高阶函数)的同义词;Curry是部分应用程序的一种形式,即未传递所有预期参数的函数将返回一个只需要自由参数的新函数

因此,它们根本不是替代品


咖喱是有用的,因为它使简洁地创建可以用作回调或在无点程序中使用的函数变得更容易。它还意味着您可以(例如)将回调传递给像
map
这样的函数,并拥有一个新函数,该函数将回调应用于您希望传递给它的任何列表的每个元素。

Currying和callbacks是两种完全不同的技术

回调本质上是“将函数传递给函数”(即使用函数的高阶函数)的同义词;Curry是部分应用程序的一种形式,即未传递所有预期参数的函数将返回一个只需要自由参数的新函数

因此,它们根本不是替代品


咖喱是有用的,因为它使简洁地创建可以用作回调或在无点程序中使用的函数变得更容易。它还意味着,例如,您可以将回调传递给像
map
这样的函数,并拥有一个新函数,将回调应用于您希望传递给它的任何列表的每个元素。

我不知道这样更好(学术意义上除外),这只是思考问题的不同方式的一部分。Curry和其他函数式习惯用法一样,有一种方法可以让熟练的程序员在不牺牲表达能力的情况下简洁地传达想法。你可能会对这些答案进行投票、接受或评论。@Marcin:我问过一个例子,说明Curry什么时候做回调所不能做的事情。仍在等待…@Magnus回调是否提供部分应用程序?不这就是你的例子。现在,你能给我举个例子,说明辣椒能做什么而汽车不能做什么吗?@Marcin:你给出的同义反复显然不是很有用。。。我希望有一个真诚的例子来演示一个编程场景,以一种标准的现有Java技术(如回调和重载)无法轻易模仿的方式展示curry的独特效用。例如,我觉得部分应用程序与链接到该方法其他版本的重载方法非常相似。由于缺乏有意义的例子,我不得不得出结论,咖喱与其说是必需品,不如说是一种方便。你同意吗?我不知道这是否更好(除了学术意义上的),这只是思考问题的不同方式的一部分。Curry和其他函数式习惯用法一样,有一种方法可以让熟练的程序员在不牺牲表达能力的情况下简洁地传达想法。你可能会对这些答案进行投票、接受或评论。@Marcin:我问过一个例子,说明Curry什么时候做回调所不能做的事情。仍在等待…@Magnus回调是否提供部分应用程序?不这就是你的例子。现在,你能给我举个例子,说明辣椒能做什么而汽车不能做什么吗?@Marcin:你所说的同义反复