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

Date: 2016-11-06 01:49 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
instance Applicative Parser where
  pure a = Parser $ \s -> [(a, s)]
  (Parser ps) <*> (Parser qs) = Parser $ \s -> [ (f a, t)
                                               | (f, s') <- ps s
                                               , (a,t) <- qs s'
                                               ]

instance Alternative Parser where
  empty = Parser $ const []
  (Parser ps) <|> (Parser qs) = Parser $ (++) <$> ps <*> qs

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

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

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

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

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

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 24th, 2025 03:42 pm
Powered by Dreamwidth Studios