SML 算术函数的类型被推断为 int

SML arithmetic function's type is inferred to int

在定义一个取值平方的简单函数时,SML NJ 将此函数的签名推断为整数类型。声明浮点类型的签名时,SML 可以在此处使用浮点值。

- fun sqr x = x * x;
val sqr = fn : int -> int
- fun sqqr (x : real) = x * x;
val sqqr = fn : real -> real
- sqqr 3.4;
val it = 11.56 : real

SML 的类型处理方法确实不能很好地处理重载,这就是为什么您不能定义自己的重载函数的原因。但是——算术运算符和关系运算符的重载在编程语言中非常普遍,以至于 SML 的设计者接受了 +* 等标准重载。这给 SML 的类型推断机制带来了问题。为了解决这个问题,他们可能需要在这种情况下进行显式类型声明,但这会降低类型推断的用处。相反,他们抓住了为具有 属性 的函数选择默认类型的想法,它们的定义对整数和实数(如果涉及 < 或 >,甚至是字符串)都非常有意义,以及一种机制覆盖默认值。鉴于 SML 的主要应用是自动定理证明而不是数值分析,int 似乎是自然的选择。每次我需要覆盖它时,我可能已经接受了 10 次默认设置。

SML 97 specification附录 E 中定义了重载运算符的行为。对于 *,+,-,默认类型是 int。对于 /,默认类型是 real。这有助于维护 "Standard ML."

中的 "Standard"