Я пишу основной монадический парсер в Идрисе, чтобы привыкнуть к синтаксису и отличиям от Haskell. У меня есть основы работы, которые работают нормально, но я застрял на попытке создания VerifiedSemigroup и VerifiedMonoid экземпляров для синтаксического анализатора.
Без лишнего внимания, здесь примеры парсера, полугруппы и моноиды, а также начало экземпляра VerifiedSemigroup.
data ParserM a = Parser (String -> List (a, String))
parse : ParserM a -> String -> List (a, String)
parse (Parser p) = p
instance Semigroup (ParserM a) where
p <+> q = Parser (\s => parse p s ++ parse q s)
instance Monoid (ParserM a) where
neutral = Parser (const [])
instance VerifiedSemigroup (ParserM a) where
semigroupOpIsAssociative (Parser p) (Parser q) (Parser r) = ?whatGoesHere
Я в основном застрял после intros
со следующим состоянием проверки:
-Parser.whatGoesHere> intros
---------- Other goals: ----------
{hole3},{hole2},{hole1},{hole0}
---------- Assumptions: ----------
a : Type
p : String -> List (a, String)
q : String -> List (a, String)
r : String -> List (a, String)
---------- Goal: ----------
{hole4} : Parser (\s => p s ++ q s ++ r s) =
Parser (\s => (p s ++ q s) ++ r s)
-Parser.whatGoesHere>
Похоже, я должен как-то использовать rewrite
вместе с appendAssociative
но я не знаю, как "попасть внутрь" лямбда \s
.
Во всяком случае, я застрял на теоретическом доказательстве части упражнения - и я не могу найти много Idris-ориентированной теоремы, подтверждающей документацию. Возможно, мне нужно начать изучать учебники Агды (хотя Идрис - это язык, набираемый в зависимости от языка, я убежден, что хочу учиться!).