2

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

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

它感觉很像 的单子形式,(<*>)并且在使用具有效果的 lambda 演算时经常出现。

4

3 回答 3

4

它几乎是 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。

于 2013-08-17T20:23:01.013 回答
2

使用原始的 Moggi 符号(第 3 页),

apm (return h) == h*

从左到右的 Kleisli 组成f >=> g == η ; f* ; g*,它坚持这一点。>=>

于 2013-08-17T14:49:37.083 回答
1

我觉得如果我们引入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

......这在国际海事组织中非常好,但我不确定这是否显示出任何“更深层次的意义”。

于 2013-08-17T08:43:30.080 回答