中间件单子?

Middleware monad?

我刚开始在 Javascript 中尝试函数式编程。

我正在学习和使用 monad(Reader、State、Fluture ...)用纯函数编写我的 Node 应用程序。

但我常常觉得需要一种数据结构,类似于 Monad,但我可以在其中链接中间件中的函数。

将其视为两个函数的结构

f: a->d
g: d->b

运行 就像组合两个函数 g(f(x))

但是我想要一个类似map的方法来在2的中间件中添加功能

所以我可以 map(h)(i)(m)

哪里

h: d -> e
i: e -> d

运行 我得到的映射结构 g(i(h(f(x))))

我试图在JS libs或论文甚至haskel world中搜索这个王的数据结构,但一无所获。我错过了什么?或者有更简单的方法以“中间件”方式组合函数而无需实现专用的 monad?

如果你想映射输出,那就是协变函子的 map 函数。

如果您想映射输入,那是逆变函子的 contramap 函数。

如果您想在中间进行更改,您可能必须自己动手,但这并不意味着您必须按顺序指定具体功能。如果我希望能够在最后一分钟从您的示例中指定 hi,我将部分应用如下函数:

const query = f => g => h => i => x => g(i(h(f(x))))
const partial = query(f)(g)
// Later on...
const withHAndI = partial(h)(i)
// Even later...
const result = withHAndI(x)

有很多方法可以使这样的东西更通用,但通常越简单越好。