如何使用parsec解析Integer

时间:2014-06-11 19:25:03

标签: haskell parsec

我期待找到一个功能

integer :: Stream s m Char => ParsecT s u m Integer

或者甚至

natural :: Stream s m Char => ParsecT s u m Integer

在标准库中,但我找不到。

将纯自然数直接解析为Integer的标准方法是什么?

2 个答案:

答案 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.ChardigitToInt {/ 1}}。

还有Data.Char的默认定义,默认情况下,它还会解析八进制和十六进制数字,并跳过尾随空格。