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

时间:2015-08-18 17:37:02

标签: types sml smlnj ml

当定义一个取值的平方的简单函数时,SML NJ将此函数的签名推断为整数类型。声明float类型的签名时,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如何在此推断出这种特定类型?
  • 是否有特定的优先选择?
  • 这些算术运算有这种特殊行为,还是可以在其他地方找到?

2 个答案:

答案 0 :(得分:5)

SML的类型方法在重载方面确实不能很好地工作,这就是为什么你不能定义自己的重载函数。但是 - 算术和关系运算符的重载在编程语言中如此普遍,以至于SML的设计者接受了+*等的标准重载。这就产生了SML类型的问题。推理机制。要解决这个问题,他们可能在这种情况下需要显式类型声明,但这会降低类型推断的有用性。相反,他们锁定了为函数选择默认类型的想法,这些函数具有其定义对于int和reals(或者甚至是涉及<或>的字符串)的完美意义的属性,以及覆盖默认。鉴于SML的主要应用是自动定理证明而不是数值分析,int似乎是自然的选择。我可能每次都需要覆盖默认值10次。

答案 1 :(得分:1)

SML 97 specification定义附录E 中重载运算符的行为。对于*,+,-,默认类型为int。对于/,默认类型为real。这有助于在“标准ML”中保持“标准”。