2012-11-26 12 views
5

Se ho un tipo in uno Stato modulotipo ocaml all'interno di un tipo

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

e ho un altro tipo nel modulo di gioco

type game = State.state 

come posso accedere ai valori record in un oggetto con tipo di gioco?

Ad esempio, se ho un gioco "g", g.x mi dà un errore "Etichetta campo x non associato".

risposta

9

I nomi dei campi si trovano nello spazio dei nomi del modulo State. Puoi dire g.State.x, oppure puoi aprire il modulo State.

let f g = g.State.x 

Oppure:

open State 

let f g = g.x 

Se si desidera che i campi di apparire nello spazio dei nomi del modulo Game, è possibile ripeterle:

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

È inoltre possibile utilizzare la struttura include per includere il modulo State.

Ad esempio, il modulo Game poteva dire:

include State 
type game = state 

In entrambi i casi, è possibile fare riferimento a Game.x:

let f g = g.Game.x 

Oppure:

open Game 
let f g = g.x 

ci sono anche due notazioni per l'apertura di un modulo per una singola espressione:

let f g = Game.(g.x) 

Oppure:

let f g = let open Game in g.x 

Edit: Ecco una sessione della riga di comando di Unix che mostra la prima soluzione (più semplice):

$ 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 nessuna di queste sembra funzionare. ..se provo g.State.x dice "Etichetta campo record non associato State.x" e inserendo lo stato aperto non cambia nulla – Mike

+1

Li ho testati tutti, quindi funzionano per me. Supponevo che ogni modulo fosse un file: state.ml, game.ml e test.ml. È necessario compilare state.ml, quindi game.ml, quindi test.ml. –

+0

Ho file mli per gioco e stato, ciò influenzerebbe in qualche modo la loro interazione? – Mike

Problemi correlati