Я пытаюсь завершить доказательство 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
или 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
Как это сделать?