为什么使用这些重载运算符定义函数时没有错误



我正在阅读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不知道xyz的类型。

当我将该定义输入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年前出版的

相关内容

  • 没有找到相关文章

最新更新