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