【问题标题】:Avoiding repetition using higher order functions in JS?在 JS 中使用高阶函数避免重复?
【发布时间】:2016-05-12 17:50:26
【问题描述】:

如何通过避免在 JavaScript 中像这样重复创建函数来编写这个 sn-p 更多功能?只是为了给出一个上下文,我试图找出从当前值到最终值的移动是否已经实现。deltaValue 如果移动朝向更高的值,则为正,如果移动朝向更低的值,则为负。

if (deltaValue > 0) {
    maxPossibleValue = function(current, final) {
        return current > final ? final : current;

    }
} else {
    maxPossibleValue = function(current, final) {
        return current < final ? final : current;
    }
}

假设在 JavaScript 中存在 &lt;&gt; 作为函数,ltgt,我可以只用一个函数来评估它,其中 predicateltgt 处理高阶函数。但是JS原生没有这样的功能,那么上面的方法是唯一的方法吗?

maxPossibleValue = function(predicate) {
    return function(c, f) {
        return predicate(c, f) ? c : f }
}

这可以被认为只是模板化所需的谓词函数并返回一个新函数。我在 Scheme 中见过这样的模式。

【问题讨论】:

  • 您是否正在尝试做这样的事情? maxPosibleValue(function(c,f) { return c > f; })(c,f);
  • 这是否达到了目标?虽然巧妙地我可以使用逻辑来翻转变量并实现我想要的。
  • 我写的内联函数是您似乎需要的方法之一(当 deltaValue 大于 0 时)。显然你可以每次改变函数的逻辑来得到你想要的行为。
  • 记住我不想重复函数:)
  • 然后将每个函数存储在变量中(如maxPossibleValue)并尽可能地通用(如在内部函数中):)

标签: javascript functional-programming


【解决方案1】:

@Nina 的回答为您指明了正确的方向,但 Math.max 和 Math.min 不是谓词。而且答案过于复杂。

我看不出答案比这个更难理解的原因

function calculateValue(delta, final, current) {
  return (delta > 0 ? Math.min : Math.max)(final, current);
}

calculateValue(-1, 5, 10); // 10
calculateValue(1, 5, 10);  // 5

【讨论】:

  • 我同意。我觉得我一开始就让它过于复杂,Nina 通过找到 Math.min、Math.max 函数修复了其中的一部分。但我认为知道我正在处理 Math.min 和 Math.max 而不是为此编写一些自定义逻辑是很微妙的重要 :)
  • @Nishant 你对ltgt 作为函数也没有错。 JavaScript 很讨厌将这些作为运算符而不是函数。我将它们定义为 const lt = x=&gt; y=&gt; y &lt; x;const gt = x=&gt; y=&gt; y &gt; x;... 以及 JavaScript 决定作为运算符实现的无数其他函数。
  • 希望他们把这个添加到语言中:)
  • @Nishant,他们不太可能这样做。 JS 是一种多范式语言,因此它的兴趣是分散的,试图满足尽可能多的程序员,但不能完全满足任何人。它不仅仅是运营商。您是否注意到 JS 中还有无数其他特殊语法? if,switch,for,while 等甚至没有返回值。不出所料,这也可以全部实现为函数,但由于某种原因它们不是。更不用说围绕newthis 的头痛了。
  • 确实如此。 magic 通常不是很好,不是吗?最好保持直截了当,这样语言语法就不会像在 Scheme 中那样打扰你。我开始欣赏这些语言,尽管普通程序员无法直接访问它们,因为它们被教授infix 符号:)
【解决方案2】:

您已经有了满足您要求的机制,Math.minMath.max

代码看起来像这样,但maxPossibleValue 具有误导性

var maxPossibleValue = function (predicate) {
        return function (c, f) {
            return predicate(c, f)
        }
    },
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max);

工作示例:

var deltaValue = -1;
var maxPossibleValue = function (predicate) {
        return function (c, f) {
            return predicate(c, f)
        }
    },
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max);

document.write(comparer(2, 8));

【讨论】:

  • 您对函数名称有什么替代建议吗?我在转换函数的上下文中使用了maxPossibleValue,这就是我在这里所做的。或者好吧,也许你的意思是它与Math.max 冲突:)
  • 可能是applyPredicate?
  • Math.maxMath.min 不是谓词。 function(c,f) { return predicate(c,f); } 简化为 predicate(eta 缩减)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多