Functor,Applicative Functor和Monad之间的关系
在阅读类型班时,我发现Functors,Applicative Functors和Monads之间的关系是严格增加权力的关系。 函子是可以映射的类型。 Applicative Functors可以在某些特定效果下做同样的事情。 Monads与可能无限制的效果相同。 此外:
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
根据布伦特Yorgey的伟大typeclassopedia,monad的另一种定义可能是:
class Applicative m => Monad' m where
(>>=) :: m a -> (a -> m b) -> m b
这显然更简单,并且可以巩固Functor <Applicative Functor <Monad。 那为什么不是这个定义呢? 我知道应用仿函数是新的,但根据2010年的Haskell报告第80页,这并没有改变。 为什么是这样?
每个人都希望应用程序成为Monad的超类,但是它会打破太多的代码(如果return
被消除,每个当前的Monad实例变得无效),每个人都希望延续这种语言,直到我们能够避免打破这种语言代码(请参阅此处了解一个重要提议)。
Haskell 2010是一个保守的,渐进式的总体改进,只标准化了一些没有争议的扩展,并打破了一个领域的兼容性,使标准与现有的每个实现一致。 实际上,Haskell 2010的图书馆甚至不包含Applicative - 少于人们对标准库期望的标准化程度,而不是你期望的。
希望我们很快会看到情况有所改善,但是幸好它通常只是一种轻微的不便(必须在通用代码中编写liftM
而不是fmap
)等。
在这一点上改变Monad的定义,会破坏很多现有的代码(任何定义Monad实例的代码)是值得的。
如果这种改变具有很大的实际利益,那么打破这种向后兼容性是值得的。 在这种情况下,好处并不是那么大(并且大多是理论上的),并且不能证明这种破坏的数量。
链接地址: http://www.djcxy.com/p/43325.html上一篇: Relationship between Functor, Applicative Functor, and Monad