从 Fluture 为 Futures 创建一个 composePipe 函数

Creating a composePipe function for Futures from Fluture

我想为管道创建一个组合函数,但我卡住了。我设法制作了一个 pointfree 管道,但无法弄清楚作曲。

// pointfree
const pipe = fn => future => future.pipe(fn)


// compose pipes   // not working
const composePipe = (...fns) => (...args) => fns.reduceRight(  (future, fn) => future.pipe(fn), args)[0];

我最终会回答你的问题,但让我们先退一步。

需要理解的重要一点是管道方法只是函数应用程序。换句话说:future.pipe (f) == f (future).

这意味着您的管道函数可以重新定义为:

const pipe = fn => future => future.pipe(fn)
//to:
const pipe = fn => value => fn (value)

这个新版本的管道以完全相同的方式工作,除了它适用于任何值,而不仅仅是 Futures。但让我们更进一步。

该函数的签名如下:pipe :: (a -> b) -> a -> b。它需要一个从 A 到 B 的函数,returns 一个从 A 到 B 的函数。

等一下....

const pipe = fn => value => fn (value)
//to:
const pipe = fn => fn

新定义做同样的事情。除了它适用于任何东西,而不仅仅是功能。其实就是恒等函数。所以 future.pipe 的 curried(你说的是 point-free,但我认为你的意思是 curried)版本只是恒等函数。

这是为什么呢?因为 .pipe 所做的只是函数应用程序 。您可以自己应用函数。


现在回答你的下一个关于组合管道的问题。您真正要寻找的是需要多个函数并按顺序应用它们的东西。

如果您使用的是 Ramda,那就是 pipe。不过我们可以自己实现:

const pipe = (...fns) => (...args) => fns.reduce ((args, f) => [f (...args)], args)[0]