中间件单子?
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
函数。
如果您想在中间进行更改,您可能必须自己动手,但这并不意味着您必须按顺序指定具体功能。如果我希望能够在最后一分钟从您的示例中指定 h
和 i
,我将部分应用如下函数:
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)
有很多方法可以使这样的东西更通用,但通常越简单越好。
我刚开始在 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
函数。
如果您想在中间进行更改,您可能必须自己动手,但这并不意味着您必须按顺序指定具体功能。如果我希望能够在最后一分钟从您的示例中指定 h
和 i
,我将部分应用如下函数:
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)
有很多方法可以使这样的东西更通用,但通常越简单越好。