mat*_*ths 3 javascript functional-programming composition lodash
我想做一些函数组合。我已经知道这一点:
如果f3(x)应该和f1(f2(x))
那时一样f3 = _.flowRight(f1,f2);
如果f3(x,y)和f1(x, f2(y))
那时一样……?
(用例是 node.js/express 中间件函数的组合。)
在下图中,我
{_}用作值的占位符。把它想象成我们传递一些东西的代码中的一个洞。
好的,让我们想象一下您的功能必须做什么......
f1和 和有f2什么区别?f1是一个只能得到一个参数的一元函数,f2是一个得到两个参数的二元函数。你会记住哪个去哪个地方吗?f1(x)被放置的位置f2?
f2(y,f1(x))...f2(f1(x),y)f1?回想一下,函数组合应该能够根据需要将尽可能多的函数链接在一起。为了帮助您理解 的无用性someFunc,让我们假设它最多接受 3 个函数和 3 个参数。
f1,仅得到一个精氨酸,而f2并f3分别获得2f2并且f3是在右侧会需要以前的函数调用的值始终?
f3(z,f2(y,f1(x)))f3(f2(y,f1(x)),z)f3需要向左链,但从f2右边链?答案是自我实现
函数组合在这里被滥用。函数组合几乎只在您组合一元函数时才有效(每个函数接受 1 个参数)。当混合更高数量的函数时,它会立即崩溃并且无法推广。
现在回到你的代码,如果f3需要一个名字,并且是f1, f2, 和两个参数的组合,它应该简单地表示为……
const f3 = (x,y) => f1(x, f2(y))
Run Code Online (Sandbox Code Playgroud)
因为它做出了如此多的任意选择,所以不能以任何有用的方式进行概括。就让它原样吧。
“那么有没有办法组合不同数量的函数?”
当然,有几种不同实用性的技术。我将partial在这里演示高度实用的功能的使用
const f3 = (x,y) => f1(x, f2(y))
Run Code Online (Sandbox Code Playgroud)
哦,顺便说一句,我们用一行代码替换了 Lodash flowRight(复杂的包装器flow)。