我正在尝试完成monadLeftIdentity
以下数据类型的证明:
data ErrorM : (a : Type) -> Type where
AllGood : a -> ErrorM a
Error : String -> ErrorM a
instance Monad ErrorM where
(AllGood x) >>= f = f x
(Error err) >>= f = Error err
instance VerifiedMonad ErrorM where
monadApplicative (AllGood f) (AllGood x) = Refl
monadApplicative (Error err) (AllGood x) = Refl
monadApplicative (AllGood f) (Error err) = Refl
monadApplicative (Error er1) (Error er2) = Refl
monadLeftIdentity x f = ?z
我省略了及其对应的实例Functor
,因为它们非常冗长和琐碎。让我知道,可以把它们都贴在这里。Applicative
Verified
我试图重写return x
为pure x
or AllGood x
,但这样做没有成功(重写对证明状态没有任何作用)。
我也尝试过这样改进return x
:
monadLeftIdentity x f with (return x)
monadLeftIdentity x' f | AllGood x' = ?z
但我收到以下错误消息:
`-- Error.idr line 51 col 22:
When elaborating left hand side of with block in Prelude.Monad.Astra.Error.ErrorM instance of Prelude.Monad.VerifiedMonad, method monadLeftIdentity:
Can't match on with block in Prelude.Monad.Astra.Error.ErrorM instance of Prelude.Monad.VerifiedMonad, method monadLeftIdentity a (AllGood x') x' b f return
怎么办?