5

如果我在模块状态中有一个类型

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

我在模块游戏中有另一种类型

type game = State.state

如何访问具有游戏类型的对象中的记录值?

例如,如果我有一个游戏“g”,gx 会给我一个“未绑定记录字段标签 x”错误。

4

1 回答 1

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
于 2012-11-26T02:46:39.287 回答