deniok: (ухмыляюсь)
deniok ([personal profile] deniok) wrote2016-11-06 12:55 pm

Не допускайте потери неоднозначности

Часто парсеры пишут в виде, допускающем разбор неоднозначных грамматик
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, конечно, еще потребуется, но тут, надеюсь, все справятся.)

[identity profile] deni-ok.livejournal.com 2016-11-06 01:57 pm (UTC)(link)
Ага, верно.
Спрячу на недельку, чтобы студенты не подглядели.

[identity profile] kurilka.livejournal.com 2016-11-06 06:25 pm (UTC)(link)
Денис, а какова судьба продолжения курса на stepic?

[identity profile] deni-ok.livejournal.com 2016-11-06 07:30 pm (UTC)(link)
Февраль ориентировочно. Видишь, задачки придумываем)

[identity profile] kurilka.livejournal.com 2016-11-06 07:54 pm (UTC)(link)
Супер

[identity profile] voidex.livejournal.com 2016-11-06 11:18 pm (UTC)(link)
О, круто!