В рамках 4-го упражнения здесь Я хотел бы использовать функцию типа reads
, например readHex
с парсеком Parser
.
. Для этого у меня естьнаписали функцию:
liftReadsToParse :: Parser String -> (String -> [(a, String)]) -> Parser a
liftReadsToParse p f = p >>= \s -> if null (f s) then fail "No parse" else (return . fst . head ) (f s)
которая может использоваться, например, в GHCI, например:
*Main Numeric> parse (liftReadsToParse (many1 hexDigit) readHex) "" "a1"
Right 161
Может кто-нибудь предложить какое-либо улучшение этого подхода в отношении:
Будет ли термин
(f s)
запоминаться или оцениваться дважды в случае возврата
null (f s)
False
? Обработка нескольких успешных разборов, т.е. когда
length (f s)
больше единицы, я не знаю, как parsec справляется с этим. Обработка оставшейся части разбора, т.е.
(snd . head) (f s)
.