Javascript功能组合/排序

Javascript功能组合/排序,javascript,functional-programming,composition,sequencing,Javascript,Functional Programming,Composition,Sequencing,我试图通过一个练习来理解Javascript中的组合和“排序”概念: Def。“合成”compose(f,g)(x)=f(g(x)) Def。“排序”sequence(f,g)(x)=g(f(x))对于更多的argssequence(f,g)(…args)=g(f(…args)) 控制台显示: [f1] working on: 1 and 2 [f1] working on: 3 and undefined Result is NaN 似乎序列中的第二个函数无法访问args:我缺少了一些东西,

我试图通过一个练习来理解Javascript中的组合和“排序”概念:

Def。“合成”
compose(f,g)(x)=f(g(x))

Def。“排序”
sequence(f,g)(x)=g(f(x))
对于更多的args
sequence(f,g)(…args)=g(f(…args))

控制台显示:

[f1] working on: 1 and 2
[f1] working on: 3 and undefined
Result is NaN
似乎序列中的第二个函数无法访问args:我缺少了一些东西,或者处理参数的方法不对?(序列函数适用于没有参数的函数)

这是

序列中的第二个函数似乎无法访问args

是的,这是正常的,也是意料之中的。根据你给的定义,

sequence(f1, f1, f2)(1, 2, 5);
相当于

f2(f1(f1(1, 2, 5)));
当然,无论是
f2
还是外部
f1
都不能访问传递给内部
f1
的参数

序列中的第二个函数似乎无法访问args

是的,这是正常的,也是意料之中的。根据你给的定义,

sequence(f1, f1, f2)(1, 2, 5);
相当于

f2(f1(f1(1, 2, 5)));

当然,无论是
f2
还是外部
f1
都不能访问传递给内部
f1

函数的参数,它们只返回一个值。有两种方法可以通过多个返回值来扩充函数:

  • 返回类似于tuple的数组
  • 而不是返回连续调用
下面是后者的一个有趣实现,它明确不适用于任何生产代码:

constpipek=g=>f=>x=>y=>k=>
k(g(x)(y)(f));
常数addk=x=>y=>k=>
(console.log(“将addk应用于”,x,y),k(x+y));
常量main=pipek(addk)
(地址)
(2)
(3)
(k=>k(4));//我们必须在继续中通过第四个参数

log(main(x=>x));//退出延续
函数只返回一个值。有两种方法可以通过多个返回值来扩充函数:

  • 返回类似于tuple的数组
  • 而不是返回连续调用
下面是后者的一个有趣实现,它明确不适用于任何生产代码:

constpipek=g=>f=>x=>y=>k=>
k(g(x)(y)(f));
常数addk=x=>y=>k=>
(console.log(“将addk应用于”,x,y),k(x+y));
常量main=pipek(addk)
(地址)
(2)
(3)
(k=>k(4));//我们必须在继续中通过第四个参数

log(main(x=>x));//退出
g(f(x))
中的延续
g
不能(也不应该!)访问
x
。一切正常,运行正常。在
g(f(x))
中,
g
不能(也不应该!)访问
x
。一切正常,并按预期运行。谢谢,“返回类似于元组的数组”是某种解决方案。谢谢,“返回类似于元组的数组”是某种解决方案。谢谢,等价性很好地解释了为什么外部函数只能使用返回值。谢谢,等价性很好地解释了为什么外部函数只能使用返回值。