gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:06:00 24 4
gpt4 key购买 nike

我想做一些函数组合。我已经知道了:

如果 f3(x) 应与 f1(f2(x)) 相同然后 f3 = _.flowRight(f1,f2);

如果 f3(x,y) 应与 f1(x, f2(y)) 相同然后……?

(用例是node.js/express中间件功能的组合。)

最佳答案

In the following images, I use {_} as a placeholder for a value. Think of it as a hole in the code where we pass something in.

好吧,让我们想象一下您的函数必须做什么...

a bad dream

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

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

a nigthmare

  • 这里有规律吗?也许吧,但你仍然有笨拙的一元函数 f1 只得到一个 arg,而 f2f3 各得到 2
  • f2f3 是否真的需要右侧的先前函数调用的值总是
    • 比较 f3(z,f2(y,f1(x)))
    • f3(f2(y,f1(x)),z)
    • 也许 f3 需要向左链接,但 f2 需要从右链接?
    • 我无法想象您的整个二进制函数 API 会神奇地在同一个地方需要链式参数
  • 你已经在你的作品中混合了一元函数和二元函数;为什么要武断地将它限制为那些类型的函数呢?有 3 个或更多参数的函数怎么样?

答案是 self 实现

函数组合在这里被滥用了。函数组合几乎只在您组合一元函数时有效(每个函数接受 1 个参数)。当混合更高质量的功能时,它会立即崩溃并且不能泛化。

现在回到您的代码,如果 f3 需要一个名称,它是 f1f2 和两个参数的组合,它应该清楚地表达为……

const f3 = (x,y) => f1(x, f2(y))

因为它做出了如此多的任意选择,所以它不能以任何有用的方式进行概括。让它保持原样。


“那么有什么方法可以组合不同元数的函数吗?”

当然,有多种实用性不同的技术。我将在此处演示高度实用的 partial 函数的使用

const partial = (f,...xs) => (...ys) => f(...xs, ...ys)

const add = (x,y) => x + y

const mult = (x,y) => x * y

const sq = x => mult (x,x)

// R.I.P. lodash.flowRight
const compose = ([f,...fs]) => x =>
f === undefined ? x : f (compose (fs) (x))

let f = compose([partial(add, 1), sq, partial(mult, 3)])

console.log(f(2))
// add(1, square(mult(3, 2)))
// add(1, square(6))
// add(1, 36)
// => 37

哦,顺便说一下,我们用一行代码替换了 Lodash 的 flowRight(复杂的包装器 flow)。

关于javascript - 如何使用 Lodash 流来组合不同数量的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161969/

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