Haskell 更重要的是;一元应用程序;?

Haskell 更重要的是;一元应用程序;?,haskell,Haskell,这个组合词有一个聪明的名字或更深的含义吗 apm :: Monad m => m (a -> m b) -> m a -> m b apm f g = f >>= (=<< g) apm::Monad m=>m(a->mb)->ma->mb 我觉得如果我们引入 所以基本上,我们有 apm' :: Monad m => m (Kleisli m a b) -> Kleisli m (m a) b …

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

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

我觉得如果我们引入

所以基本上,我们有

apm' :: Monad m =>  m (Kleisli m a b)
                 -> Kleisli m (m a) b
…在我看来这很好,但我不确定这是否显示出任何“更深刻的意义”。

(第3页)


它认为,
f>=>g==η;f*;g*
,与

几乎是阿罗的一元等价物

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

结论:这是
app
的一元等价物,它允许你产生一个一元术语并使用它。它可以很高兴地用一组最小的函数替换
>=
join
来定义一个单子。

它更清楚地写为
join.ap
,这似乎也暗示了一点听你说的。很好!虽然它实际上是
join.:ap
(.:)=(.)(\x->fx>>=g)=(\x->(返回x>>=f)>>=g)=(返回>>>(>>=f)>>>(>>=g))=~=η;f*;g*
app' :: Monad m => m (a -> m b, a) -> m b
appm :: Monad m => m (a -> m b) -> m a -> m b