Haskell 多个数据构造函数的Monad实例

Haskell 多个数据构造函数的Monad实例,haskell,monads,Haskell,Monads,不久前我开始学习Haskell,现在我在自学单子,所以我在这里为自己举了一个愚蠢的例子来帮助我理解单子的一个方面 给定类型确定性定义为 data Certainty a = Definitely a | Perhaps a | Nope 以及所述类型的Monad实例 instance Monad Certainty where return = ... 如何定义方法return的确定性及其每个数据构造函数?您必须根据我建议的命名选择一个方法 return value = Definite

不久前我开始学习Haskell,现在我在自学单子,所以我在这里为自己举了一个愚蠢的例子来帮助我理解单子的一个方面

给定类型
确定性
定义为

data Certainty a = Definitely a | Perhaps a | Nope
以及所述类型的
Monad
实例

instance Monad Certainty where
  return = ...

如何定义方法
return
的确定性及其每个数据构造函数?

您必须根据我建议的命名选择一个方法

return value = Definitely value
记住
返回a>>=f
必须是
fa

bind可能应该是

(Definitely a) >>= f = f a
(Perhaps a)    >>= f = case f a of
                          Definitely b -> Perhaps b
                          Perhaps b    -> Perhaps b
                          Nope         -> Nope
Nope           >>= _ = Nope

Carsten的回答当然是非常正确的,但根据我的经验,通常通过定义
join
函数来指定monad(特别是在这种情况下,任何孩子都会理解,如果妈妈说我们明天肯定会吃冰淇淋,这意味着我们可能会吃冰淇淋……)

当然,
>=
可以根据
连接
fmap
来定义(这对于
确定性
来说微不足道,并且可以通过
ghc
-XDeriveFunctor
自动找到)

这使得我的定义和卡斯滕的相同

此外,通过查看
join
定义的最后三行,我们发现对于所有
x::确定性a
我们有
join(肯定x)=x
,这表明

 return x = Definitely x

这是
WriterT Any Maybe
单子,在这里我们将
明确地解释为
Just(False,a)
可能地解释为
Just(True,a)
,以及
Nope
解释为
Nothing
(用适当的新类型包装)。或者只是我的想法;)
x >>= f = join (fmap f x)
 return x = Definitely x