gpt4 book ai didi

haskell - Functor、Applicative Functor 和 Monad 之间的关系

转载 作者:行者123 更新时间:2023-12-03 08:30:06 27 4
gpt4 key购买 nike

在阅读类型类时,我发现 Functor、Applicative Functor 和 Monad 之间的关系是严格递增的权力。仿函数是可以映射的类型。 Applicative Functors 可以做同样的事情并产生一定的效果。单子(monad)与可能的非限制性效果相同。而且:

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 < Applicative Functor < Monad。那么为什么不是这个定义呢?我知道应用仿函数是新的,但根据 2010 Haskell Report第 80 页,这没有改变。为什么是这样?

最佳答案

每个人都希望看到 Applicative 成为 Monad 的父类(super class),但它会破坏太多代码(如果 return 被消除,每个当前的 Monad 实例都将变得无效),每个人都希望推迟,直到我们能够以这样的方式扩展语言避免破坏代码(see here 用于一个突出的提案)。

Haskell 2010 总体上是一个保守的渐进式改进,仅标准化了一些没有争议的扩展并破坏了one area 中的兼容性。使标准与每个现有实现保持一致。事实上,Haskell 2010 的库甚至不包括 Applicative——人们对 the standard library 的期望更少。比您预期的要标准化。

希望我们很快会看到情况有所改善,但幸运的是,这通常只是轻微的不便(必须在通用代码中编写 liftM 而不是 fmap 等)。

关于haskell - Functor、Applicative Functor 和 Monad 之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8658384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com