所以我掀起了一个自定义错误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)
答案 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
其他两项法律的程序大致相同。