5
如果我有一个模块州ocaml的类型
type state = {x: int; y: int}
一个类型,我在模块比赛另一种类型的
type game = State.state
我怎么可以访问一个对象的记录值类型游戏?
例如,如果我有一个游戏“g”,g.x会给我一个“Unbound record field label x”错误。
如果我有一个模块州ocaml的类型
type state = {x: int; y: int}
一个类型,我在模块比赛另一种类型的
type game = State.state
我怎么可以访问一个对象的记录值类型游戏?
例如,如果我有一个游戏“g”,g.x会给我一个“Unbound record field label x”错误。
字段的名称位于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
那些哼都不似乎工作。 ..如果我尝试g.State.x它说“解除绑定的记录字段标签State.x”并插入打开的状态不会改变任何东西 – Mike
我测试了它们,所以它们为我工作。我假定每个模块都是一个文件:state.ml,game.ml和test.ml.需要编译state.ml,然后是game.ml,然后是test.ml. –
我有游戏和状态的mli文件,会以任何方式影响他们的互动吗? – Mike