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