Haskell 多个数据构造函数的Monad实例
不久前我开始学习Haskell,现在我在自学单子,所以我在这里为自己举了一个愚蠢的例子来帮助我理解单子的一个方面 给定类型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
确定性
定义为
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