为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript管道函数 - 为什么所有标准实现都返回一个带参数的函数

Javascript管道函数 - 为什么所有标准实现都返回一个带参数的函数

跃然一笑 2022-05-26 14:54:01
我在javascript中看到了很多管道的实现。所有这些都是以函数式编程方式编写的,从一个函数开始,该函数将所有fns要通过管道传输的作为参数,然后返回一个函数,该函数将参数传递给第一个函数。然后,此返回的函数负责将fns.像这样的东西:pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);以确实需要返回一个函数并且可以只在其参数中获取参数的方式编写此函数是否有任何问题:pipe = (x, ...fns) => fns.reduce((v, f) => f(v), x);他们两个工作一样吗?这个比那个好吗 ?
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

第一种方法更通用,因此可能更有用。考虑您希望在多个输入上调用一些管道函数的情况,而不仅仅是一个:


const pipe = (x, ...fns) => fns.reduce((v, f) => f(v), x);

console.log(

  pipe(1, x => x + 2, x => x * 2),

  pipe(3, x => x + 2, x => x * 2),

);

太丑了 高阶函数可以让您编写更少重复的代码:


const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);

const changeNum = pipe(x => x + 2, x => x * 2);

console.log(

  changeNum(1),

  changeNum(3),

);

如果您处于不必多次调用管道函数的情况下,那么一种方法相对于另一种方法并没有太多具体的好处(也许,对于参数输入 - 具有相同的参数,例如...fns, 可能被认为比混合表示根本不同事物的参数更优雅,例如(x, ...fns))。


也就是说,不必考虑您所处的情况会更容易,在这种情况下,无论如何标准pipe功能(...fns) => x =>是更可取的,因为它对于所有情况都足够灵活,与替代方案不同。


查看完整回答
反对 回复 2022-05-26
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

给定curry = f => x => y => f(x, y)并且uncurry = f => (x, y) => f(x) (y)它们是相同的,即您可以将一种形式转换为另一种形式,反之亦然(忽略其余参数)。


但问题是,为什么您首先要为自己的功能带来负担?为什么函数的数量完全不同?如果每个函数只接受一个参数,它们的 API 将被简化,我们可以将它们结合起来,限制更少:


const fold = f => acc => xs => xs.reduce((acc, x) => f(acc) (x));

const pipe = g => f => x => f(g(x));

const flip = f => y => x => f(x) (y);

const id = x => x;


const pipen = fold(pipe) (id);

const comp = flip(pipe);

const compBin = comp(comp) (comp);

const compBin3 = compBin(compBin) (compBin);


const inc = x => x + 1;

const sqr = x => x * x;

const add = x => y => x + y;


console.log(

  "pipen",

  pipen([inc, inc, inc, inc, sqr]) (1)); // 25


console.log(

  "compBin",

  compBin(add) (add) (2) (3) (4)); // 9

  

console.log(

  "compBin3",

  compBin3(add) (add) (add) (2) (3) (4) (5)); // 14

没有人会定义compcompBin我做的方式。它应该只是说明可能性。



查看完整回答
反对 回复 2022-05-26
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号