【问题标题】:Trouble understanding the source code of different instances of `MonadPlus` typeclass无法理解 `MonadPlus` 类型类的不同实例的源代码
【发布时间】:2020-12-24 16:18:29
【问题描述】:

我正在浏览 MonadPlus 类型类的源代码及其实例,如 Maybe[] 等。我没有找到这些实例的方法 - mzeromplus 已定义。这是MaybeMonadPlus 实例的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[]mzeromplus 的标准定义。

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(&lt;|&gt;)MonadPlus默认定义。这并不意味着 list 和 Maybe 不能覆盖这些定义。虽然,Maybes 的emptyNothing,而Maybes 的(&lt;|&gt;)mplus 的“标准定义”,所以它们不需要覆盖任何内容。
  • @Aplet123 我现在明白了。我以前从未见过没有方法的实例,所以我有点困惑。谢谢!
  • @Aplet123 你能把你的评论变成答案吗?最好避免在 cmets 中回答问题。
  • MINIMAL pragma,例如一个简单的类型类Eq有默认方法(但你不能给一个空实例)和下面的pragma:{-# MINIMAL (==) | (/=) #-}你只需要定义a == b(在这种情况下a /= b = not (a == b))或a /= b(然后a == bnot (a == b))。但是你只需要定义一个。祝你的 Haskelling 好运
  • @Iceland_jack 所以,基本上MINIMAL pragma 告诉我们所有实例必须实现什么方法。如果没有像MonadPlus 那样的MINIMAL pragma,那么我们不需要它的实例来实现任何方法(mzeromplus)。我对吗?谢谢!

标签: haskell monads alternative-functor


【解决方案1】:

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

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

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

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

基本上,标准定义仍然是正确的,它只是扩展了默认值并将Alternative 排除在外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2012-03-14
    • 2015-05-27
    相关资源
    最近更新 更多