我正在查看MonadPlus类型类的源代码和它的实例,比如Maybe,[]等。我没有找到这些实例的方法- mzero或mplus定义的。下面是MonadPlus的Maybe实例的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而在现实世界Haskell的Chapter 15中,它说以下是mzero和mplus对于Maybe和[]的标准定义。
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所以本质上我的问题是为什么会有这样的区别?
发布于 2020-12-25 02:18:41
mzero = empty和mplus = (<|>)行指定默认实现,任何实现者都可以覆盖这些实现。empty和(<|>)来自Alternative typeclass,它是为可能和列表定义的:
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
instance Alternative [] where
empty = []
(<|>) = (++)因此,Alternative定义已经与默认的MonadPlus定义匹配,所以他们可以简单地编写instance MonadPlus Maybe并使用默认的定义。
从本质上讲,标准定义仍然是正确的,它只是扩展了默认值,并将Alternative排除在外。
https://stackoverflow.com/questions/65440803
复制相似问题