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
来写,但是一般不能用 <*>
来实现 >>=
,所以 >>=
是严格来说更强大的操作等
仿函数有
(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
来写,但是一般不能用 <*>
来实现 >>=
,所以 >>=
是严格来说更强大的操作等