haskell 如何使用parsec解析Integer

70gysomp  于 2023-05-23  发布在  其他
关注(0)|答案(3)|浏览(146)

我希望能找到一个函数

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

甚至可能

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

在标准库中,但我没有找到。
将普通自然数直接解析为Integer的标准方法是什么?

f3temu5u

f3temu5u1#

这里是我经常做的是用表达

read <$> many1 digit

其类型可以是Stream s m Char => ParsecT s u m Integer(或简称为Parser Integer)。
我不喜欢使用partial函数read,但当解析器成功时,我知道read也会成功,而且它在某种程度上是可读的。

pkwftd7m

pkwftd7m2#

查看Text.Parsec.Token的源代码,似乎Parsec没有专门的函数。它们确实为GenLanguageDefdecimal字段给予了默认定义。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取自Data.Char
natural还有一个默认定义,默认情况下,它也解析八进制和十六进制数字,并跳过尾随的空格。

piv4azn7

piv4azn73#

有一个包parsec3-numbers [hackage],它提供了解析某些格式的数字的函数。
可能最有趣的是**int :: (Integral i, Stream s m Char) => ParsecT s u m inat :: (Integral i, Stream s m Char) => ParsecT s u m i**,它们分别解析整数和自然数。它们不仅将数字解析为十进制格式,还解析为八进制和十六进制格式。该包还包含一些解析器,它们限制解析特定的基数,例如十进制数。

相关问题