如何在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大。
答案 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>的