我正在阅读Colin Myers、Chris Clack和Ellen Poon的《用标准ML编程》。在§2.4.1限制多态函数中:
与运算符
=
和<>
不同,其他比较运算符(>
、<
等(重载;它们不是限制多态的,因此以下定义失败:- fun wrong_ordered (x, y, z) = (x < y) andalso (y < z); Error: overloaded variable "<" cannot be resolved
发生此故障是因为SML不知道
x
、y
和z
的类型。
当我将该定义输入SML/NJ 110.99.2和Poly/ML 5.9时,我没有收到任何错误消息。定义成功:
- fun wrong_ordered (x, y, z) = (x < y) andalso (y < z);
val wrong_ordered = fn : int * int * int -> bool
为什么我没有得到作者说我会得到的错误?
这本书早于SML’97。使用该语言版本,重载运算符的类型解析得到了改进。特别是,当无法通过上下文解析重载类型时,它们现在默认为int
。
除非指定任何类型,否则编译器将确定wrong_ordered
采用三个int
值。
将其与OCaml进行比较,后者确实具有多态性比较。
# let wrong_ordered x y z = x < y && y < z;;
val wrong_ordered : 'a -> 'a -> 'a -> bool = <fun>
如果为wrong_ordered
指定哪怕一个参数的类型,也会同样推断出其他类型。
fun wrong_ordered (x: real, y, z) = (x < y) andalso (y < z);
类型:
val wrong_ordered = fn: real * real * real → bool;
请记住,您所引用的书是29年前出版的