According to chapter 11 of Real World OCaml,行多态不能用于创建异类容器。
特别是,行多态不能用于在同一容器中放置不同类型的对象。例如,无法使用行多态
创建异构元素列表
给出的例子是:
type square = < area : float; width : int >;;
type shape = < variant : repr; area : float>
and circle = < variant : repr; area : float; radius : int >
and line = < variant : repr; area : float; length : int >
and repr =
| Circle of circle
| Line of line;;
# let hlist: < area: float; ..> list = [square 10; circle 30] ;;
Characters 49-58:
Error: This expression has type < area : float; radius : int >
but an expression was expected of type < area : float; width : int >
The second object type has no method radius
由于错误消息如此清楚地表明,元素的类型不匹配。我的问题是为什么不能排多态&#34;隐藏&#34;不匹配的记录方法,即对容器中的所有类型进行交集?
如果按照这种思路进行逻辑推理,那么最终会得到一个类型错误较少的系统,但很多推断类型<>
没有方法。
答案 0 :(得分:3)
可以这样做,但你必须明确地这样做:
let hlist = [(square 10 :> shape); (circle 30 :> shape)]
它没有自动完成的原因可能是类型系统变得不可判断的(根据http://caml.inria.fr/pub/docs/manual-ocaml/objectexamples.html它已经处于不可判定的边缘)。但我不知道细节。