这个组合器有一个聪明的名字或更深层的含义吗?
apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)
它感觉很像 的单子形式,(<*>)
并且在使用具有效果的 lambda 演算时经常出现。
这个组合器有一个聪明的名字或更深层的含义吗?
apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)
它感觉很像 的单子形式,(<*>)
并且在使用具有效果的 lambda 演算时经常出现。
它几乎是 Arrow 的一元等价物
app :: ArrowApply (~>) => (b ~> c, b) ~> c
如果app
是一元的,它的类型将被音译为
app' :: Monad m => m (a -> m b, a) -> m b
但是使用函数来引入更大的灵活性也是一元编程的一部分(实际上,忽略灵活性Arrow
就是为什么app
需要)。因此,该类型的更好但更少的字面翻译将是
appm :: Monad m => m (a -> m b) -> m a -> m b
这是你给的类型。结论:这是 的 monadic 等价物app
,它允许您产生一个 monadic 术语并使用它。它可以很高兴地替换>>=
或join
在一组最小的函数中定义一个 monad。
我觉得如果我们引入Kleisli 箭头,它看起来可能会更自然地出现......
a -> m b ≅ Kleisli m a b
m a -> m b ≅ Kleisli m (m a) b
所以基本上,我们有
apm' :: Monad m => m (Kleisli m a b)
-> Kleisli m (m a) b
......这在国际海事组织中非常好,但我不确定这是否显示出任何“更深层次的意义”。