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

lun*_*nuy 3 monads haskell

函子有

(a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)

适用有

f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

Monad 有

m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

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

m a -> m (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

或者

m (a -> m b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)

?

K. *_*uhr 14

一个Monad约束是足以实现与该类型签名(显)功能:

foo :: Monad m => m (a -> m b) -> m a -> m b
foo mf ma = do
   f <- mf
   a <- ma
   f a
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意:

foo' :: Monad m => m (a -> m b) -> m a -> m b
foo' mf ma = mf >>= \f -> ma >>= f
Run Code Online (Sandbox Code Playgroud)

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

相比之下,其他操作的功率并不相同。任何可适用的操作<*>可以写成方面>>=return,但你不能在一般的实施>>=来讲<*>,所以>>=是一个严格的更强大的操作等