5

10 進数形式で書かれた整数を読み取るのは非常に簡単です。

Prelude> read "1000000000" :: Int
1000000000

しかし、指数形式で書かれた整数を読み取る方法は?

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

それを行う関数はありPreludeますか、それとも式を解析する必要がありますか?

返信ありがとうございます。

4

2 に答える 2

3

ここにパーサーがあります

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

与える

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

また、

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

整数の答えを返す負の指数に対処できるようにすることもできますが、それは read 関数にはやり過ぎです。

于 2012-11-27T11:35:47.130 に答える
2

Depending on the exact format of the string, you could just read it into a floating point type:

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

then convert to an integral type -- I'd recommend Integer instead of Int:

> floor (read "10e+9" :: Double) :: Integer
10000000000
于 2012-11-26T15:18:33.137 に答える