为什么 OCaml 成功地将"列表与 int 列表"匹配,而标准 ML 却无法做到这一点?



在OCaml中,let f (x : 'a) : 'a list = x :: [0]具有签名val f : int -> int list

当我试图在标准ML中定义一个类似的函数fun f (x : 'a) : 'a list = x :: [0]时,出现了一个错误。

SML/NJ:

- fun f (x : 'a) : 'a list = x :: [0];
stdIn:2.6-2.14 Error: operator and operand do not agree [overload - user bound tyvar]
operator domain: 'a * 'a list
operand:         'a * 'Z[INT] list
in expression:
x :: 0 :: nil

Poly/ML:

> fun f (x : 'a) : 'a list = x :: [0];
poly: : error: Type error in function application.
Function: :: : 'a * 'a list -> 'a list
Argument: (x, [0]) : 'a * int list
Reason: Can't unify int to 'a (Cannot unify with explicit type variable)
Found near x :: [0]
Static Errors

OCaml和标准ML中的类型系统之间的区别是什么,导致标准ML出现错误,而OCaml没有出现错误?

在OCaml中,类型归属中的类型变量表示统一变量。它并不表示该类型是多态的,它只是为该类型提供了一个名称,该名称将参与与其他类型的统一。

我记得,在SML中,在类型归属中使用类型变量意味着该类型是特定多态的。因此,当您将类型'a归因于x时,您是在说实际参数必须具有多态类型。由于没有像这样完全多态的有效值,这必然会导致错误。

(我相信这是对的,但其他人比我知识渊博得多。(

最新更新