【发布时间】:2020-12-24 16:18:29
【问题描述】:
我正在浏览 MonadPlus 类型类的源代码及其实例,如 Maybe、[] 等。我没有找到这些实例的方法 - mzero 或 mplus 已定义。这是Maybe 的MonadPlus 实例的source code:
class (Alternative m, Monad m) => MonadPlus m where
mzero :: m a
mzero = empty
mplus :: m a -> m a -> m a
mplus = (<|>)
instance MonadPlus Maybe
虽然在 Real World Haskell 的Chapter 15 中,它说以下是Maybe 和[] 的mzero 和mplus 的标准定义。
class Monad m => MonadPlus m where
mzero :: m a
mplus :: m a -> m a -> m a
instance MonadPlus [] where
mzero = []
mplus = (++)
instance MonadPlus Maybe where
mzero = Nothing
Nothing `mplus` ys = ys
xs `mplus` _ = xs
所以本质上我的问题是为什么会有差异?
【问题讨论】:
-
empty和(<|>)是MonadPlus的默认定义。这并不意味着 list 和 Maybe 不能覆盖这些定义。虽然,Maybes 的empty是Nothing,而Maybes 的(<|>)是mplus的“标准定义”,所以它们不需要覆盖任何内容。 -
@Aplet123 我现在明白了。我以前从未见过没有方法的实例,所以我有点困惑。谢谢!
-
@Aplet123 你能把你的评论变成答案吗?最好避免在 cmets 中回答问题。
-
看
MINIMALpragma,例如一个简单的类型类Eq有默认方法(但你不能给一个空实例)和下面的pragma:{-# MINIMAL (==) | (/=) #-}你只需要定义a == b(在这种情况下a /= b=not (a == b))或a /= b(然后a == b是not (a == b))。但是你只需要定义一个。祝你的 Haskelling 好运 -
@Iceland_jack 所以,基本上
MINIMALpragma 告诉我们所有实例必须实现什么方法。如果没有像MonadPlus那样的MINIMALpragma,那么我们不需要它的实例来实现任何方法(mzero和mplus)。我对吗?谢谢!
标签: haskell monads alternative-functor