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