如何使用 Lodash 流组合不同数量的函数?

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 中间件函数的组合。)

Tha*_*you 5

在下图中,我{_}用作值的占位符。把它想象成我们传递一些东西的代码中的一个

好的,让我们想象一下您的功能必须做什么......

一个恶梦

  • 这看起来像是一个通用的转换吗?即,您认为我们可以在很多地方使用它吗?– 函数式编程促进构建高度可重用且可以以各种方式组合的函数。
  • f1和 和有f2什么区别?f1是一个只能得到一个参数的一元函数,f2是一个得到两个参数的二元函数。你会记住哪个去哪个地方吗?
  • 什么支配f1(x)被放置的位置f2
    • 比较f2(y,f1(x))...
    • f2(f1(x),y)
    • 其中一个比另一个更有用吗?
    • 你会记住哪个位置f1

回想一下,函数组合应该能够根据需要将尽可能多的函数链接在一起。为了帮助您理解 的无用性someFunc,让我们假设它最多接受 3 个函数和 3 个参数。

噩梦

  • 这里甚至有模式吗?也许吧,但你仍然有尴尬的一元函数f1,仅得到一个精氨酸,而f2f3分别获得2
  • 这是真的,f2并且f3是在右侧会需要以前的函数调用的值始终
    • 相比 f3(z,f2(y,f1(x)))
    • f3(f2(y,f1(x)),z)
    • 也许f3需要向左链,但从f2右边链?
    • 我无法想象你的整个二元函数 API 会神奇地需要在同一个地方链接参数
  • 你已经在你的组合中混合了一元和二元函数;那么为什么要随意将其限制为那些类型的函数呢?具有 3 个或更多参数的函数呢?

答案是自我实现

函数组合在这里被滥用。函数组合几乎只在您组合一元函数时才有效(每个函数接受 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)。