所以,我正在用SML编写程序。它运行完美,但是当应用很大的整数时,会产生此错误:
uncaught exception Overflow [overflow]
raised at:Basis/Implementation/num-scan.sml:268.20-268.28
我认为我应该使用IntInf结构而不是int。 但是由于我在程序中将int转换为String,反之亦然,所以如何将IntInf转换为String?
答案 0 :(得分:0)
使用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
来使类型{ {1}}被类型int
覆盖。但是SML / NJ似乎很灵活,这似乎不是必需的,至少在REPL中没有。
您还可以使用较小的31位整数构造它:
IntInf.int
这里的文字- IntInf.pow (IntInf.fromInt 2, 64);
val it = 18446744073709551616 : IntInf.int
和2
符合以下功能:
64
因此,尽管整数文字在SML / NJ中被重载,因此它们既可以直接表示- IntInf.fromInt;
val it = fn : int -> IntInf.int
- IntInf.pow;
val it = fn : IntInf.int * int -> IntInf.int
,也可以表示31位整数,但是您也可以构造IntInf
而不用引用这样的文字,使用更小的整数和库函数(因此IntInf
被更多地视为抽象类型)。但这不是必须的。