将maxInt保存在变量中(标准ML)

时间:2018-04-13 13:32:19

标签: sml ml

如何在SML中将Integer的最大值放入val中? 我看到你可以使用intMax

> Int.maxInt;
val it = SOME 1073741823 : int option

但如果我尝试将其作为值放入val,则会打印错误:

> val max:int = Int.maxInt;
Error: pattern and expression in val dec don't agree [tycon mismatch]
pattern:    int
expression:    int option
in declaration:
max : int = Int.maxInt

虽然val max = Int.maxInt有效,但它会:val max = SOME 1073741823 : int option

我希望变量属于int类型,而不是int option

换句话说,输出应该是:

> val max = 1073741823 : int

修改

感谢您的回答。是否可以将值大于maxInt? 我想算一下:

fun someCalculation num = ceil((Math.sqrt(1.0+8.0*real(num))-1.0)/2.0);
val max_int = Option.valOf Int.maxInt;
val current = someCalculation max_value;

因为8.0*real(maxInt)它不会起作用。有可能算吗?请注意,最终答案并不比maxInt大。

1 个答案:

答案 0 :(得分:2)

  

如何在SML中将Integer的最大值放入val?

您可以使用Option.valOf : 'a option -> 'a删除“选项”部分:

- val max = valOf Int.maxInt;
> val max = 1073741823 : int

使用valOf通常不安全,因为valOf NONE会引发异常:

- valOf NONE;
! Uncaught exception:
! Option

只有当您的编译器的未来版本附带任意大小的Int模块时,才会发生这种情况。由于SML / NJ已将IntInf作为一个单独的模块,因此可能不会立即发生。

  

是否可以将值设置为大于maxInt?

不使用 int (太小):

- valOf Int.maxInt + 1;
! Uncaught exception:
! Overflow

并没有使用真实的(太不精确):

- Real.== (real (valOf Int.maxInt) + 1.0,
           real (valOf Int.maxInt));
> val it = true : bool

但是使用IntInf库,是的:

- IntInf.maxInt;
> val it = NONE : int option

- IntInf.fromInt (valOf Int.maxInt) * 8;
> val it = 8589934584 : IntInf.int

如您所见,SML / NJ重载整数文字,因此它们既可以作为 int (读取: Int31.int ),也可以作为 IntInf.int < / em>的