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