2012-11-26 10 views
5

Jeśli mam typu, w stanie modułutyp ocaml ramach typu

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

i mam innego typu w module Gra

type game = State.state 

w jaki sposób mogę uzyskać dostęp do wartości rekordów w obiekcie z typ gry?

Na przykład, jeśli mam grę "g", g.x daje mi błąd "Niezwiązana etykieta pola rekordu x".

Odpowiedz

9

Nazwy pól znajdują się w przestrzeni nazw modułu State. Możesz powiedzieć g.State.x, lub możesz otworzyć moduł State.

let f g = g.State.x 

Lub:

open State 

let f g = g.x 

Jeśli chcesz pola pojawiać się w przestrzeni nazw modułu Game, można je powtórzyć:

type game = State.state = {x: int; y: int} 

Można również skorzystać z możliwości include obejmować moduł State.

Na przykład, moduł Game mógł powiedzieć:

include State 
type game = state 

W obu tych przypadkach można zwrócić się do Game.x:

let f g = g.Game.x 

Lub:

open Game 
let f g = g.x 

Istnieje także dwie notacje do otwarcia modułu dla pojedynczego wyrażenia:

let f g = Game.(g.x) 

Lub:

let f g = let open Game in g.x 

Edit: Oto Unix wiersza polecenia sesji, który pokazuje pierwszy (najprostszy) rozwiązanie:

$ 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

hmm żadna z tych wydają się działać. ..if Próbuję g.State.x mówi "Niezwiązana etykieta pola rekordu State.x" i wstawienie stanu otwartego nic nie zmienia – Mike

+1

Przetestowałem je wszystkie, więc pracują dla mnie. Zakładałem, że każdy moduł był plikiem: state.ml, game.ml i test.ml. Musisz skompilować plik state.ml, następnie game.ml, a następnie test.ml. –

+0

Mam pliki mli do gry i stanu, czy to wpłynęłoby na ich interakcje w jakikolwiek sposób? – Mike