Часто парсеры пишут в виде, допускающем разбор неоднозначных грамматик
newtype Parser a = Parser { apply :: String -> [(a, String)] }
(Тип apply это не что иное, как стандартный ReadS.) Однако, начав таким образом, лучше быть консистентным, поддерживая эту возможность повсюду, например
parse :: Parser a -> String -> [a
(
Read more... )
Comments 6
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
Reply
Спрячу на недельку, чтобы студенты не подглядели.
Reply
Reply
Reply
Leave a comment