因此,我正在用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


文字64IntInf在这里适合这些函数:

- IntInf.fromInt;
val it = fn : int -> IntInf.int

- IntInf.pow;
val it = fn : IntInf.int * int -> IntInf.int


因此,尽管整数文字在SML / NJ中被重载,因此它们可以直接表示IntInf或31位整数,但也可以使用纯粹较小的整数和库函数构造IntInf而不引用此类文字(因此,被更多地视为抽象类型)。这不是必须的。

10-06 10:29