2012-11-26 9 views
5

Um eine ganze Zahl geschrieben in Dezimalform zu lesen ist ganz einfach:Wie liest man eine ganze Zahl in Exponentialform mit Haskell?

Prelude> read "1000000000" :: Int 
1000000000 

Aber wie eine ganze Zahl geschrieben in exponentieller Form lesen?

Prelude> read "10e+9" :: Int 
*** Exception: Prelude.read: no parse 

Gibt es eine Funktion in den Prelude, das zu tun, oder brauchen wir den Ausdruck analysieren?

Danke für jede Antwort.

+2

Nichts im 'Prelude', Sie müssen Ihren eigenen Parser schreiben, fürchte ich. –

+0

Ihr Beispiel funktioniert für mich (obwohl es überläuft) mit ghc 7.0.4. – dave4420

+3

@ dave4420 Funktioniert nicht mehr mit ghc> = 7.4. Es hätte vorher auch nicht nach dem Bericht funktionieren sollen. –

Antwort

2

über das genaue Format der Zeichenfolge Je konnte man nur read es in einen Floating-Point-Typ:

> read "10e+9" :: Double 
1.0e10 

then convert to an integral type - Ich würde empfehlen, Integer statt Int:

> floor (read "10e+9" :: Double) :: Integer 
10000000000 
+0

'Prelude> Etage 10e78 ==> 9999999999999999673560075006595519222746403606649979913266024618633003221909504' –

+0

@Will' ghci> 10e780', 'ghci> Etage 10e780' muss Fließkommazahlen lieben. –

+0

Es schlägt beim Lesen von "5.e-003" fehl, was einige Engineering-Software produziert. – CMCDragonkai

3

Hier ist ein Parser

readI xs = let (m,e) = break (=='e') xs in 
    read m * 10^case e of 
     "" -> 1 
     ('e':'+':p) -> read p 
     ('e':p) -> read p 

Geben

Main> readI "3e5" 
300000 
Main> readI "3e+500" 
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
Main> readI "3e+500" :: Int 
0 
Main> readI "3e+500" :: Integer 
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

Und auch

Main> readI "32e-5" 
Program error: Prelude.^: negative exponent 

Wir könnten versuchen, um es mit negativen Exponenten zu machen zu bewältigen, die ganzzahlige Antworten geben, aber das würde viel des Guten für eine Lesefunktion sein.

Verwandte Themen