Haskell - 是否有扩展的 monad 类型 [ m (a -> m b) -> m a -> m b ]

Haskell - is there extended monad type [ m (a -> m b) -> m a -> m b ]

仿函数有

(a -> b) -> m a -> m b

应用有

f (a -> b) -> f a -> f b

Monad 有

m a -> (a -> m b) -> m b

但是,是否有扩展的 monad 类型具有

m a -> m (a -> m b) -> m b

m (a -> m b) -> m a -> m b

?

Monad 约束足以实现具有该类型签名的(合理的)函数:

foo :: Monad m => m (a -> m b) -> m a -> m b
foo mf ma = do
   f <- mf
   a <- ma
   f a

或者,如果您愿意:

foo' :: Monad m => m (a -> m b) -> m a -> m b
foo' mf ma = mf >>= \f -> ma >>= f

这意味着您提议的操作,即使它 看起来 像通常的 >>= 绑定操作的概括,实际上并不是一般化。任何>>=运算都可以写成foo,任何foo运算都可以写成>>=,所以它们是等价的“幂”运算。

相比之下,其他的操作都是的等价。任何应用操作 <*> 都可以用 >>=return 来写,但是一般不能用 <*> 来实现 >>=,所以 >>= 是严格来说更强大的操作等