javascript - 如何构建一个适用于多参数柯里化(Currying)函数的最终参数的装饰器?

标签 javascript functional-programming

我正在尝试用 JavaScript 编写一个函数库。我也在使用 lodash

到目前为止,我抽象地得到了什么:

x = _.curry(function(property, data) {
  return data.get(property);
});

有了这个,您可以执行 x(1)(2)x(1, 2),一切都会按预期进行。

假设我想修改该函数,使其data可以是一个数组:

x = _.curry(function(property, data) {
  if (_.isArray(data)) {
    return _.map(data, x(property));
  } else {
    return item.get(property);
  }
});

现在效果很好。但我有 30 多个功能。必须有一种比手动为每个函数编写 if (_.isArray(data)... else... 更好的方法。也许是一个装饰器?

decorate = function(func) {
  // return a curried func and handle the aforementioned _.isArray
}

x = decorate(function(property, data) {
  if (_.isArray(data)) {
    return _.map(data, x(property));
  } else {
    return item.get(property);
  }
});

我完全不知道如何编写装饰函数:一个可以使用 arity 2 和 arity 3 函数进行装饰的函数。

最佳答案

首先,用映射数组参数的函数包装原始函数,然后柯里化(Currying)该包装版本。

var decorate = function(func) {
    var mapIfArray = function(property, data) {
        if (_.isArray(data)) {
            return _.map(data, _.curry(func)(property));
        } else {
            return func(property, data);
        }
    }

    return _.curry(mapIfArray);
}

你可以像这样使用它:

var undecorated = function(property, data) {
    return data.get(property);
}

var decorated = decorate(undecorated);

假设所有未修饰的函数都是 arity 2,最后可能是数组。如果情况并非如此,您要么必须为不同的参数创建不同的装饰器,要么对参数对象执行某种巫术。

关于javascript - 如何构建一个适用于多参数柯里化(Currying)函数的最终参数的装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572276/

相关文章:

javascript - 如何将事件监听器仅附加到新创建的元素?

functional-programming - Scheme 上是否有 "set!"的替代方案

javascript - 如何将此JavaScript代码转换为功能方式(最好使用Ramdajs)?

php - 除非启用 Javascript,否则使用 php 函数

javascript - 如何在 HTML 或 javascript 中绘制渐变背景?

javascript - 将对象中的数组属性扩展到填充有数组值的多个对象

algorithm - 有效检查Scala流中的​​值是否存在(以功能方式)

types - 将其参数应用于自身的函数?

javascript - 在完整日历中的日期渲染上显示加号图标

javascript - jQuery 从许多具有相同 .class 的元素中更改单击元素的 CSS 背景