作为这里第四个练习的一部分,
我想使用一个reads
类型函数,比如readHex
一个 parsec 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)
.