2012-11-26 114 views
5

如果我有一个模块州ocaml的类型

type state = {x: int; y: int} 

一个类型,我在模块比赛另一种类型的

type game = State.state 

我怎么可以访问一个对象的记录值类型游戏?

例如,如果我有一个游戏“g”,g.x会给我一个“Unbound record field label x”错误。

回答

9

字段的名称位于State模块名称空间中。你可以说g.State.x,或者你可以打开State模块。

let f g = g.State.x 

或者:

open State 

let f g = g.x 

如果你想要的字段出现在Game模块命名空间,你可以重复他们:

type game = State.state = {x: int; y: int} 

您还可以使用include设施包括State模块。

例如,您Game模块可以说:

include State 
type game = state 

在这两种情况下,你可以参考Game.x

let f g = g.Game.x 

或者:

open Game 
let f g = g.x 

有还有两个符号用于为单个表达式打开模块:

let f g = Game.(g.x) 

或者:

let f g = let open Game in g.x 

编辑:这里是一个Unix命令行会话,显示第一(简单的)解决方案:

$ cat state.ml 
type state = { x: int; y : int } 
$ cat game.ml 
type game = State.state 
$ cat test.ml 
let f (g: Game.game) = g.State.x 

let() = Printf.printf "%d\n" (f { State.x = 3; y = 4}) 
$ ocamlc -o test state.ml game.ml test.ml 
$ ./test 
3 
+0

那些哼都不似乎工作。 ..如果我尝试g.State.x它说“解除绑定的记录字段标签State.x”并插入打开的状态不会改变任何东西 – Mike

+1

我测试了它们,所以它们为我工作。我假定每个模块都是一个文件:state.ml,game.ml和test.ml.需要编译state.ml,然后是game.ml,然后是test.ml. –

+0

我有游戏和状态的mli文件,会以任何方式影响他们的互动吗? – Mike