Dưới đây là trình phân tích cú pháp
readI xs = let (m,e) = break (=='e') xs in
read m * 10^case e of
"" -> 1
('e':'+':p) -> read p
('e':p) -> read p
Giving
Main> readI "3e5"
300000
Main> readI "3e+500"
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Main> readI "3e+500" :: Int
0
Main> readI "3e+500" :: Integer
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Và cũng
Main> readI "32e-5"
Program error: Prelude.^: negative exponent
Chúng ta có thể cố gắng để làm cho nó đối phó với số mũ âm mà cho nguyên câu trả lời nhưng đó sẽ là quá mức cần thiết cho một chức năng đọc.
Không có gì trong 'Prelude', bạn cần phải viết trình phân tích cú pháp của riêng mình, tôi sợ. –
Ví dụ của bạn làm việc cho tôi (mặc dù nó tràn) bằng cách sử dụng ghc 7.0.4. – dave4420
@ dave4420 Không hoạt động với ghc> = 7.4 nữa. Nó không nên làm việc trước đó một trong hai, theo báo cáo, iirc. –