1

我正在浏览类型类的源代码MonadPlus及其实例,例如Maybe[]等等。我没有找到这些实例的方法 -mzeromplus定义。这是实例的源代码MaybeMonadPlus

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 的第 15 章中,它说以下是 and 的标准定义mzeroand 。mplusMaybe[]

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

所以基本上我的问题是为什么会有区别?

4

1 回答 1

3

和行指定默认实现,任何实现者都可以覆盖它mzero = empty。并来自typeclass,它是为 Maybes 和列表定义的:mplus = (<|>)empty(<|>)Alternative

instance Alternative Maybe where
    empty = Nothing
    Nothing <|> r = r
    l       <|> _ = l

instance Alternative [] where
    empty = []
    (<|>) = (++)

因此,Alternative定义已经与默认MonadPlus定义匹配,因此他们可以简单地编写instance MonadPlus Maybe和使用默认值。

本质上,标准定义仍然是正确的,它只是扩展了默认值并Alternative退出了图片。

于 2020-12-24T18:18:40.717 回答