在我写的错误monad上证明了一些monad定律

时间:2011-03-07 00:41:29

标签: haskell monads proofs

所以我掀起了一个自定义错误monad,我想知道如何为它证明一些monad定律。如果有人愿意花时间帮助我,我将不胜感激。谢谢!

这是我的代码:

data Error a = Ok a | Error String

instance Monad Error where
    return = Ok
    (>>=) = bindError

instance Show a => Show (Error a) where
    show = showError

showError :: Show a => Error a -> String
showError x =
    case x of
        (Ok v) -> show v
        (Error msg) -> show msg

bindError :: Error a -> (a -> Error b) -> Error b
bindError x f = case x of
    (Ok v) -> f v
    (Error msg) -> (Error msg)

2 个答案:

答案 0 :(得分:1)

你的monad与Either String a同形(Right = Ok,Left = Error),我相信你已经正确实现了它。至于证明法律得到满足,我建议考虑当g导致错误时以及h导致错误时会发生什么。

答案 1 :(得分:1)

首先说明等式的一边,然后尝试到达另一边。我通常从“更复杂”的一面开始,朝着更简单的方向努力。对于第三定律,这不起作用(双方都同样复杂),所以我通常从两边走,尽可能地简化它们,直到我到达同一个地方。然后我可以反过来从其中一方获取证据的步骤。

例如:

return x >>= g

然后展开:

= Ok x >>= g
= bindError (Ok x) g
= case Ok x of { Ok v -> g v ; ... }
= g x

因此我们证明了

return x >>= g = g x

其他两项法律的程序大致相同。