2012-11-26 113 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