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 的类型推断机制带来了问题。为了解决这个问题,他们可能需要在这种情况下进行显式类型声明,但这会降低类型推断的用处。相反,他们抓住了为具有 属性 的函数选择默认类型的想法,它们的定义对整数和实数(如果涉及 < 或 >,甚至是字符串)都非常有意义,以及一种机制覆盖默认值。鉴于 SML 的主要应用是自动定理证明而不是数值分析,int
似乎是自然的选择。每次我需要覆盖它时,我可能已经接受了 10 次默认设置。
SML 97 specification 在附录 E 中定义了重载运算符的行为。对于 *,+,-
,默认类型是 int
。对于 /
,默认类型是 real
。这有助于维护 "Standard ML."
中的 "Standard"
在定义一个取值平方的简单函数时,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 的类型推断机制带来了问题。为了解决这个问题,他们可能需要在这种情况下进行显式类型声明,但这会降低类型推断的用处。相反,他们抓住了为具有 属性 的函数选择默认类型的想法,它们的定义对整数和实数(如果涉及 < 或 >,甚至是字符串)都非常有意义,以及一种机制覆盖默认值。鉴于 SML 的主要应用是自动定理证明而不是数值分析,int
似乎是自然的选择。每次我需要覆盖它时,我可能已经接受了 10 次默认设置。
SML 97 specification 在附录 E 中定义了重载运算符的行为。对于 *,+,-
,默认类型是 int
。对于 /
,默认类型是 real
。这有助于维护 "Standard ML."