【发布时间】:2012-01-29 07:29:26
【问题描述】:
在阅读类型类时,我发现 Functor、Applicative Functor 和 Monad 之间的关系是严格递增的权力。函子是可以映射的类型。 Applicative Functor 可以用某些效果做同样的事情。具有可能不受限制效果的单子相同。此外:
Every Monad is an Applicative Functor
Every Applicative Functor is a Functor
Applicative Functor 的定义清楚地表明了这一点:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
但是Monad的定义是:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
m >> n = m >>= \_ -> n
fail :: String -> m a
根据 Brent Yorgey 的伟大 typeclassopedia,monad 的另一种定义可能是:
class Applicative m => Monad' m where
(>>=) :: m a -> (a -> m b) -> m b
这显然更简单和将巩固 Functor 2010 Haskell Report 第80 页,这并没有改变。这是为什么呢?
【问题讨论】:
-
"Monads 与非限制性效果相同。"你是从哪里得到这个想法的?
-
我当然犯了在 Monads 和 IO 之间放置等号的错误。说什么更正确?
-
@MagnusKronqvist:也许“依赖”是一个更好的词。 Applicative 和 Monad 之间的主要区别在于
(<*>) :: f (a -> b) -> f a -> f b和(=<<) :: (a -> m b) -> m a -> m b的类型,即结果的m部分可以依赖于输入中的a,而对于 applicative,结果的f部分结果必须与a输入的值无关。 -
class Applicative m => Monad'' m where join :: m (m a) -> m a是另一个可能的最小完整定义。 (也在 typeclassopedia 中注明) -
@MagnusKronqvist:这里是 Monad 给你的我喜欢的 Applicative 的解释:Applicative 强制计算的结构是 static,而 Monad 允许它是 动态,取决于其他计算的结果。
标签: haskell