假设:
type thing = {foo: string; score: int; };; (* possibly more fields... *)
let m = {foo = "Bar"; score = 1; };;
Printf.printf "%s\n" m.foo;; (*=> "Bar" *)
是否可以使用字段名称作为字符串访问记录的成员(即,假设我们只有字符串m.foo
),而不是"foo"
?
当然,这可以通过地图实现,但所有成员必须是同一类型:
module Thing = Map.Make(String);;
let m = Thing.empty;;
let m = Thing.add "foo" "Bar" m;;
let m = Thing.add "score" "1" m;; (* must all be same type *)
Printf.printf "%s\n" (Thing.find "foo" m);; (*=> "Bar" *)
答案 0 :(得分:2)
您已在地图评论中捕捉到问题的本质。 OCaml是强类型的,你不能拥有一个类型根据参数改变的函数。所以没有办法做你想做的事。
最好使用使用OCaml类型系统,而不是反对它。一旦您重新考虑编码技术(我认为),就会有很多好处。
您可以将不同类型包装到代数类型的不同变体中。这可能对你有用。
type myFooOrScore = Foo of string | Score of int
let field r = function
| "foo" -> Foo r.foo
| "score" -> Score r.score
| _ -> raise Not_found