2014-06-11 1 views
4

Je me attendais à trouver une fonctionComment analyser un nombre entier avec parsec

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

ou peut-être même

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

dans les bibliothèques standard, mais je ne trouve pas.

Quelle est la manière standard d'analyser des nombres naturels simples directement sur un Integer?

+0

http://hackage.haskell.org/package/parsec-3.1.5/docs/Text-Parsec-Token.html#v:integer – d8d0d65b3f7cf42

+0

Merci. Mais cela fait plus que ce que je veux. Il analyse l'espace blanc autour, et j'ai besoin de faire d'abord un analyseur de jeton .... –

+0

Ne pouvez-vous pas convertir l'instance 'Read' pour' Integer' dans un 'Parser' en utilisant la fonction' reads'? –

Répondre

10

Voici ce que je fais souvent est d'utiliser l'expression

read <$> many1 digit 

qui peut avoir le type Stream s m Char => ParsecT s u m Integer (ou tout simplement Parser Integer).

Je n'aime pas l'utilisation de la fonction partielle read, mais quand l'analyseur réussit, je sais que le read va réussir, et il est quelque peu lisible.

+0

Pourriez-vous inclure une signature de type pour plus de clarté? –

+0

Sure chose; terminé. –

2

En regardant la source de Text.Parsec.Token, il semble que Parsec n'a pas de fonction dédiée pour cela. Ils donnent une définition par défaut pour le champ decimal de GenLanguageDef. decimal est défini similaire à:

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 

Ici, digit est tiré de Text.Parsec.Char et digitToInt de Data.Char.

Il existe également une définition par défaut pour natural qui, par défaut, analyse également les nombres octaux et hexadécimaux et ignore les espaces de fin.

+0

Aussi, [cette réponse] (http://stackoverflow.com/a/10726784/824425) est vraiment similaire, un peu plus courte grâce à son style applicatif, et utilise 'foldl 'au lieu de' foldl' plus un ' seq' au mauvais endroit :) –

+1

Qui montre le besoin d'une réponse évidemment correcte dans les bibliothèques ... –

Questions connexes