函数currying vs普通的回调方法

时间:2012-03-17 02:55:48

标签: interface callback functional-programming currying

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

我理解curry是什么,我只是不明白为什么它需要自己的术语和语言支持才有用。

有人可以通过currying解释一个编程情况,而不是通过回调方法吗? currying对每个参数使用单独的函数这一事实的实际意义是什么?

[update:]总结了我得到的答案:currying来自于函数是“一等”公民的事实,即可以像任何其他对象引用一样创建和传递的对象。这使得可以从函数返回函数,换句话说就是currying。

关于currying有用的原因,currying提供了一种语法,让你可以简洁地修饰函数调用,这样就可以用最少的样板代码开销创建派生函数。在java中,您可以为每个部分参数集创建多个重载或“包装”方法,最终调用包含所有参数的主方法,currying提供了一个更轻的语法,允许您根据需要在代码中生成这些“函数包装器”。 / p>

2 个答案:

答案 0 :(得分:1)

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

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

interface Fun<A,B> {
    public B apply(A a);
}

或类似的内容。

答案 1 :(得分:1)

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

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

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

Currying很有用,因为它可以更简单地创建可以用作回调的函数,或者在无点程序中。这也意味着你可以,例如将回调传递给类似map的函数,并有一个新函数将您的回调应用于您要传递给它的任何列表中的每个元素。