多数据构造函数的Monad实例

Mon*_*nad 3 monads haskell

我不久前开始使用Haskell,现在正在教我自己的monad,所以我在这里为自己想出了一个愚蠢的例子来帮助我理解monad的一个方面.

给定Certainty定义为的类型

data Certainty a = Definitely a | Perhaps a | Nope
Run Code Online (Sandbox Code Playgroud)

Monad所述类型的实例

instance Monad Certainty where
  return = ...
Run Code Online (Sandbox Code Playgroud)

如何return为Certainty及其每个数据构造函数定义该方法?

Car*_*ten 6

你必须选择一个 - 根据我建议的命名

return value = Definitely value
Run Code Online (Sandbox Code Playgroud)

记得那return a >>= f一定是f a

绑定应该是

(Definitely a) >>= f = f a
(Perhaps a)    >>= f = case f a of
                          Definitely b -> Perhaps b
                          Perhaps b    -> Perhaps b
                          Nope         -> Nope
Nope           >>= _ = Nope
Run Code Online (Sandbox Code Playgroud)

  • 这是`WriterT Any Maybe` monad,我们将`绝对a`解释为`Just(False,a)`,`或许a`为`Just(True,a)`,而`Nope`为`Nothing`(适当的newtype包裹所有周围). (2认同)