我可以将IntInf转换为String吗?

时间:2019-06-04 05:57:10

标签: sml

所以,我正在用SML编写程序。它运行完美,但是当应用很大的整数时,会产生此错误:

     uncaught exception Overflow [overflow] 
        raised at:Basis/Implementation/num-scan.sml:268.20-268.28

我认为我应该使用IntInf结构而不是int。 但是由于我在程序中将int转换为String,反之亦然,所以如何将IntInf转换为String?

1 个答案:

答案 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被更多地视为抽象类型)。但这不是必须的。