因此,我正在用SML编写程序。它运行完美,但是当应用很大的整数时,会产生此错误:
uncaught exception Overflow [overflow]
raised at:Basis/Implementation/num-scan.sml:268.20-268.28
我认为我应该使用IntInf结构而不是int。
但是由于在程序中我将int转换为String,反之亦然,所以如何将IntInf转换为String?
最佳答案
使用IntInf.toString
:
$ sml
Standard ML of New Jersey v110.79 [built: Tue Aug 8 23:21:20 2017]
- IntInf.toString 1234567890123456789012345678901234567890;
[autoloading]
[...]
val it = "1234567890123456789012345678901234567890" : string
我实际上以为这会产生解析错误,因为整数文字太大而无法容纳标准的31位整数,因此必须
open IntInf
以便int
类型被IntInf.int
覆盖。类型2
。但是SML / NJ似乎很灵活,这似乎不是必需的,至少在REPL中没有。您还可以从较小的31位整数构造它:
- IntInf.pow (IntInf.fromInt 2, 64);
val it = 18446744073709551616 : IntInf.int
文字
64
和IntInf
在这里适合这些函数:- IntInf.fromInt;
val it = fn : int -> IntInf.int
- IntInf.pow;
val it = fn : IntInf.int * int -> IntInf.int
因此,尽管整数文字在SML / NJ中被重载,因此它们可以直接表示
IntInf
或31位整数,但也可以使用纯粹较小的整数和库函数构造IntInf
而不引用此类文字(因此,被更多地视为抽象类型)。这不是必须的。