这个组合子有一个聪明的名字或更深层的含义吗?
apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)
感觉很像(<*>)
的monadic形式,并且在使用lambda演算时会频繁出现。
答案 0 :(得分:4)
这几乎就是Arrow的
的monadic等价物app :: ArrowApply (~>) => (b ~> c, b) ~> c
如果app
是monadic,则其类型将被音译为
app' :: Monad m => m (a -> m b, a) -> m b
但它也是使用函数引入更大灵活性的monadic编程的一部分(事实上,Arrow
的灵活性遗漏是需要app
的原因。因此,该类型的更好但不那么字面的翻译将是
appm :: Monad m => m (a -> m b) -> m a -> m b
这是你给的类型。结论:这是app
的monadic等价物,它允许您生成一个monadic术语并使用它。它可以很乐意在一组最小的函数中替换>>=
或join
来定义一个monad。
答案 1 :(得分:2)
使用original Moggi notation(第3页),
apm (return h) == h*
它与left-to-right Kleisli composition >=>
保持f >=> g == η ; f* ; g*
。
答案 2 :(得分:1)
如果我们介绍Kleisli arrows ...
,我觉得这看起来更自然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
...这是相当不错的IMO,但我不确定这是否显示出任何“更深层含义”。