类型中的ocaml类型

Mik*_*ike 5 ocaml types records

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

type state = {x: int; y: int}
Run Code Online (Sandbox Code Playgroud)

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

type game = State.state
Run Code Online (Sandbox Code Playgroud)

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

例如,如果我有一个游戏"g",gx给我一个"未绑定的记录字段标签x"错误.

Jef*_*eld 9

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

let f g = g.State.x
Run Code Online (Sandbox Code Playgroud)

要么:

open State

let f g = g.x
Run Code Online (Sandbox Code Playgroud)

如果希望字段显示在Game模块命名空间中,可以重复它们:

type game = State.state = {x: int; y: int}
Run Code Online (Sandbox Code Playgroud)

您还可以使用该include工具包含该State模块.

例如,您的Game模块可以说:

include State
type game = state
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,您都可以参考Game.x:

let f g = g.Game.x
Run Code Online (Sandbox Code Playgroud)

要么:

open Game
let f g = g.x
Run Code Online (Sandbox Code Playgroud)

还有两种表示法只能为一个表达式打开一个模块:

let f g = Game.(g.x)
Run Code Online (Sandbox Code Playgroud)

要么:

let f g = let open Game in g.x
Run Code Online (Sandbox Code Playgroud)

编辑: 这是一个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
Run Code Online (Sandbox Code Playgroud)