JavaScript curry:有哪些实际应用?

我不认为我已经摸索咖喱了。我了解它的作用,以及如何做到这一点。我只是想不出我会使用它的情况。

你在JavaScript中在哪里使用咖喱(或者主要库在哪里使用它)?欢迎使用 DOM 操作或一般应用程序开发示例。

其中一个答案提到了动画。像 这样的函数将元素作为参数,通常是返回内置默认“动画函数”的高阶函数的 curried 函数。为什么这比仅仅应用具有某些默认值的上级函数更好?slideUpfadeIn

使用它有什么缺点吗?

根据要求,这里有一些关于JavaScript咖喱的好资源:

我会添加更多,因为它们在评论中突然出现。


因此,根据答案,咖喱和部分应用一般都是便利技术。

如果您经常通过使用相同的配置调用高级函数来“优化”该函数,则可以使用(或使用Resig的部分)高级函数来创建简单,简洁的帮助器方法。


答案 1

以下是JavaScript中使用闭包的currying的有趣且实际的用法

function converter(toUnit, factor, offset, input) {
    offset = offset || 0;
    return [((offset + input) * factor).toFixed(2), toUnit].join(" ");
}

var milesToKm = converter.curry('km', 1.60936, undefined);
var poundsToKg = converter.curry('kg', 0.45460, undefined);
var farenheitToCelsius = converter.curry('degrees C', 0.5556, -32);

milesToKm(10);            // returns "16.09 km"
poundsToKg(2.5);          // returns "1.14 kg"
farenheitToCelsius(98);   // returns "36.67 degrees C"

这依赖于 的扩展,尽管如您所见,它只使用(没有什么太花哨的):curryFunctionapply

Function.prototype.curry = function() {
    if (arguments.length < 1) {
        return this; //nothing to curry with - return function
    }
    var __method = this;
    var args = toArray(arguments);
    return function() {
        return __method.apply(this, args.concat([].slice.apply(null, arguments)));
    }
}

答案 2

@Hank 同性恋

回应EmbiggensTheMind的评论:

我想不出一个实例,其中咖喱本身在JavaScript中是有用的;它是一种将具有多个参数的函数调用转换为函数调用链的技术,每个调用都有一个参数,但JavaScript支持单个函数调用中的多个参数。

在JavaScript中 - 我假设大多数其他实际语言(不是lambda演算) - 它通常与部分应用程序相关联。John Resig对此的解释更好,但要点是有一些逻辑可以应用于两个或多个参数,而您只知道其中一些参数的值。

您可以使用部分应用程序/查询来修复这些已知值,并返回一个只接受未知值的函数,稍后当您实际拥有要传递的值时调用该函数。这提供了一种很好的方式来避免重复自己,当你一遍又一遍地调用相同的JavaScript内置时,所有相同的值,但只有一个。借用约翰的例子:

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );