gpt4 book ai didi

functional-programming - 在 underscore.js 中链接操作(如 map reduce)时,是否有提供最终转换方法的方法?

转载 作者:行者123 更新时间:2023-12-01 11:52:39 24 4
gpt4 key购买 nike

(真的很难给这个问题起标题,所以如果有人有任何建议,请随意。)

假设我想做这样的操作:

  • 取一个数组 [1,2,3]
  • 将每个元素乘以 2(映射):[2,4,6]
  • 将元素加在一起(减少):12
  • 将结果乘以 10: 120

我可以使用链接在下划线中非常干净地完成此操作,如下所示:

arr = [1,2,3]
map = (el) -> 2*el
reduce = (s,n) -> s+n
out = (r) -> 10*r

reduced = _.chain(arr).map(map).reduce(reduce).value()
result = out(reduced)

但是,如果我也可以像这样链接“out”方法,那就更好了:

result = _.chain(arr).map(map).reduce(reduce).out(out).value()

现在这将是对像 underscore 这样的库的一个相当简单的添加。但我的问题是:

  • 这个“out”方法在函数式编程中有名称吗?
  • 这是否已经存在于下划线中(tap 接近,但不完全)。

最佳答案

这个问题让我非常着迷。这是我的一些想法。

感觉在“chain() 模式”下使用 underscore.js 会脱离函数式编程范式。基本上,您不是在函数上调用函数,而是以 OOP 方式调用包装器对象实例的方法。

我正在使用 underscore's chain()我自己在这里和那里,但这个问题让我思考。如果简单地创建更有意义的函数然后可以在序列中调用而根本不必使用 chain() 会更好吗?您的示例将如下所示:

arr = [1,2,3]
double = (arr) -> _.map(arr, (el) -> 2 * el)
sum = (arr) -> _.reduce(arr, (s, n) -> s + n)
out = (r) -> 10 * r

result = out sum double arr
# probably a less ambiguous way to do it would be
result = out(sum(double arr))

看看真正的函数式编程语言(比如......比 JavaScript 更实用),似乎你可以用更简单的方式做完全相同的事情。这是用标准 ML 编写的同一个程序。请注意仅使用一个参数调用 map 如何返回另一个函数。无需像我们在 JavaScript 中那样将此映射包装在另一个函数中。

val arr = [1,2,3];
val double = map (fn x => 2*x);
val sum = foldl (fn (a,b) => a+b) 0;
val out = fn r => 10*r;

val result = out(sum(double arr))

标准 ML 还允许您创建运算符,这意味着我们可以制作一个小的“链式”运算符,用于以更直观的顺序调用这些函数。

infix 1 |>;
fun x |> f = f x;

val result = arr |> double |> sum |> out

我还认为这个 underscore.js 链接与​​函数式编程中的 monads 类似,但我对这些了解不多。不过,我觉得这种数据操作管道不是您通常会使用 monad 的东西。

如果我在上述任何一点上有错误,我希望有更多函数式编程经验的人可以插话并纠正我。

更新

稍微偏离主题,但创建部分函数的一种方法可能如下:

// extend underscore with partialr function
_.mixin({
partialr: function (fn, context) {
var args = Array.prototype.slice.call(arguments, 2);
return function () {
return fn.apply(context, Array.prototype.slice.call(arguments).concat(args));
};
}
});

此函数现在可用于从任何下划线函数创建部分函数,​​因为它们中的大多数都将输入数据作为第一个参数。例如,现在可以像这样创建 sum 函数

var sum = _.partialr(_.reduce, this, function (s, n) { return s + n; });
sum([1,2,3]);

不过我还是更喜欢 arr |> double |> sum |> out out(sum(double(arr)))。 Underscore 的 chain() 很好,因为它以更自然的顺序读取。

关于functional-programming - 在 underscore.js 中链接操作(如 map reduce)时,是否有提供最终转换方法的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com