从 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]
我想为管道创建一个组合函数,但我卡住了。我设法制作了一个 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]