【发布时间】:2014-04-01 10:23:15
【问题描述】:
我正在尝试在 OCaml 中创建一个过程对象语言系统。一般的想法是将多态变量的值存储在一个数组中,并让程序更新这个数组(命令式):
module StrMap = Map.Make(String)
module IntMap = Map.Make(struct type t = int let compare = compare end)
(* store generic labeled objects *)
type 'a env = ([> ] as 'a) IntMap.t
(* a procedure working on such an object array *)
type 'a procedure = 'a env -> 'a env
(* store procedures *)
type 'a proc_table = ('a procedure) StrMap.t
let do_iinc = function
| `Int n -> `Int (n+1)
let iinc x env =
let v = do_iinc (IntMap.find x env) in
IntMap.add x v env
let do_finc = function
| `Float f -> `Float (f +. 1.0)
let finc x env = IntMap.add x (do_finc (IntMap.find x env)) env
(* type error :( *)
let table =
StrMap.add "iinc" (iinc 0)
(StrMap.add "finc" (finc 1)
StrMap.empty)
这让我很困惑。我的“更新”对于具体类型是不变的。 OCaml 不应该能够找出该表:([`Float of float ; `Int of int ] procedure) StrMap.t 吗?
我怀疑问题与 map 的方差有关,但我无法确认,因为我无法使用具体的多态变体注释类型。
我的想法在 OCaml 中是否可行?
【问题讨论】:
标签: polymorphism ocaml variance