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
有一个包parsec3-numbers [hackage],它提供了解析某些格式的数字的函数。 可能最有趣的是**int :: (Integral i, Stream s m Char) => ParsecT s u m i和nat :: (Integral i, Stream s m Char) => ParsecT s u m i**,它们分别解析整数和自然数。它们不仅将数字解析为十进制格式,还解析为八进制和十六进制格式。该包还包含一些解析器,它们限制解析特定的基数,例如十进制数。
3条答案
按热度按时间f3temu5u1#
这里是我经常做的是用表达
其类型可以是
Stream s m Char => ParsecT s u m Integer
(或简称为Parser Integer
)。我不喜欢使用partial函数
read
,但当解析器成功时,我知道read
也会成功,而且它在某种程度上是可读的。pkwftd7m2#
查看
Text.Parsec.Token
的源代码,似乎Parsec没有专门的函数。它们确实为GenLanguageDef
的decimal
字段给予了默认定义。decimal
的定义类似于:这里,
digit
取自Text.Parsec.Char
,digitToInt
取自Data.Char
。natural
还有一个默认定义,默认情况下,它也解析八进制和十六进制数字,并跳过尾随的空格。piv4azn73#
有一个包
parsec3-numbers
[hackage],它提供了解析某些格式的数字的函数。可能最有趣的是**
int :: (Integral i, Stream s m Char) => ParsecT s u m i
和nat :: (Integral i, Stream s m Char) => ParsecT s u m i
**,它们分别解析整数和自然数。它们不仅将数字解析为十进制格式,还解析为八进制和十六进制格式。该包还包含一些解析器,它们限制解析特定的基数,例如十进制数。