OCaml中的多态对象更新

时间:2014-04-11 13:56:54

标签: object polymorphism ocaml

我想要实现一个系统,其中对象在其字段内容上是多态的,并且内容可以更改。即对象为每个字段{{1}提供了一种通用方式来交换字段f,其值a的值为a_t,值b的类型为b_t }。

首次尝试将是这样的:

f

这不是多态的,因为class ['a] not_working (a : 'a) = object val _a = a method field_a = _a method modify_a new_a = {< _a = new_a >} end 的类型是:

not_working

即。修改产生相同类型的对象。

我的解决方法如下:

class ['a] not_working : 'a -> object ('b) val _a : 'a method field_a : 'a method modify_a : 'a -> 'b end

我为the_class中的每个字段生成一个修改函数,此修改函数更新此字段并复制所有其他字段。这很吵。

有没有办法以类似的方式使用对象复制操作符或类似的构造来减少样板?

1 个答案:

答案 0 :(得分:0)

我认为你不能用对象做你想做的事情,因为我认为这会涉及非常规的递归类型:

type 'a foo = < modify: 'b. 'b -> 'b foo >

如果您尝试定义该类型,请注意错误消息:

Characters 4-42:
  type 'a foo = < modify: 'b. 'b -> 'b foo >;;
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: In the definition of foo, type 'b foo should be 'a foo

使用记录(或一流模块)可能会有更好的运气:

# type ('a, 'b) foo = { a: 'a; b: 'b };;
type ('a, 'b) foo = { a : 'a; b : 'b; }

# let new_foo a b = {a; b};;
val new_foo : 'a -> 'b -> ('a, 'b) foo = <fun>

# let modify_a r new_a = { r with a = new_a };;
val modify_a : ('a, 'b) foo -> 'c -> ('c, 'b) foo = <fun>

# let modify_b r new_b = { r with b = new_b };;
val modify_b : ('a, 'b) foo -> 'c -> ('a, 'c) foo = <fun>