Не допускайте потери неоднозначности
Nov. 6th, 2016 12:55 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Часто парсеры пишут в виде, допускающем разбор неоднозначных грамматик
newtype Parser a = Parser { apply :: String -> [(a, String)] }(Тип apply это не что иное, как стандартный ReadS.) Однако, начав таким образом, лучше быть консистентным, поддерживая эту возможность повсюду, например
parse :: Parser a -> String -> [a] parse p = map fst . filter (null . snd) . apply pСделайте приведенный выше парсер представителем Applicative и Alternative, так чтобы обеспечить следующее поведение
> twoChars x = (\a b -> [a,b]) <$> char x <*> char x > threeChars x = (\a b c -> [a,b,c]) <$> char x <*> char x <*> char x > parse (some (twoChars '7') <|> some (threeChars '7')) "777777" [["77","77","77"],["777","777"]](Парсер char, конечно, еще потребуется, но тут, надеюсь, все справятся.)