Haskell-是否有扩展的monad类型[m(a->mb)->ma->mb]
函子有
(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,但你不能在一般的实施>>=来讲<*>,所以>>=是一个严格的更强大的操作等
THE END
二维码