我期待找到一个功能
integer :: Stream s m Char => ParsecT s u m Integer
或者甚至
natural :: Stream s m Char => ParsecT s u m Integer
在标准库中,但我找不到。
将纯自然数直接解析为Integer
的标准方法是什么?
答案 0 :(得分:10)
我经常做的是使用表达式
read <$> many1 digit
可以有Stream s m Char => ParsecT s u m Integer
类型(或简称为Parser Integer
)。
我不喜欢使用部分函数read
,但是当解析器成功时,我知道read
会成功,并且它有点可读。
答案 1 :(得分:2)
看看Text.Parsec.Token
的来源,似乎Parsec没有专门的功能。他们确实为decimal
的{{1}}字段提供了默认定义。 GenLanguageDef
的定义类似于:
decimal
此处decimal = do
digits <- many1 baseDigit
let n = foldl (\x d -> base*x + toInteger (digitToInt d)) 0 digits
seq n (return n)
where
base = 10
baseDigit = digit
取自digit
Text.Parsec.Char
和digitToInt
{/ 1}}。
还有Data.Char
的默认定义,默认情况下,它还会解析八进制和十六进制数字,并跳过尾随空格。