我稍微改变了布局,但这里是我们正在考虑的代码示例:
parseNumber =
liftM (Number . read) $
choice [many1 digit, char '#' >> oneOf "hd" >>= a]
where
a f =
case f of
'h' -> many1 digit
我认为你在知道事情应该如何结合之前试图同时做太多事情。您必须以某种方式将 areadHex
移入该(Number . read)
部分而不是read
,具体取决于正在读取的数字类型。
这是一个不使用liftM
或其他花哨组合符的十六进制数字解析器:
parseHex :: Parser LispVal
parseHex = do
char '#'
char 'x'
digits <- many1 hexDigit -- hexDigit is defined by Parsec.
return (Number (fst (readHex digits !! 0)))
这里棘手的部分是提取readHex
.
您可以将解析器与
try parseHex <|> try parseOct <|> ... <|> parseDec
或者喜欢调整和内联以及 Parsec 的许多工具。但我会从基础开始。