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

下一篇: How to return a list of tuples in Haskell