更多的是“monadic应用”?

时间:2013-08-17 02:38:27

标签: haskell

这个组合子有一个聪明的名字或更深层的含义吗?

apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)

感觉很像(<*>)的monadic形式,并且在使用lambda演算时会频繁出现。

3 个答案:

答案 0 :(得分:4)

这几乎就是Arrow的

的monadic等价物
app :: ArrowApply (~>) => (b ~> c, b) ~> c

我是answering about recently

如果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,但我不确定这是否显示出任何“更深层含义”。