2012-11-26 31 views
5

Nếu tôi có một loại trong một mô-đun Nhà nướcloại ocaml trong một loại

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

và tôi có một loại khác trong mô-đun game

type game = State.state 

làm thế nào tôi có thể truy cập các giá trị kỷ lục trong một đối tượng với loại trò chơi?

Ví dụ: nếu tôi có trò chơi "g", g.x cho tôi lỗi "Lỗi trường bản ghi không được gửi x".

Trả lời

9

Tên của các trường nằm trong không gian tên mô-đun State. Bạn có thể nói g.State.x hoặc bạn có thể mở mô-đun State.

let f g = g.State.x 

Hoặc:

open State 

let f g = g.x 

Nếu bạn muốn các lĩnh vực xuất hiện trong không gian tên Game module, bạn có thể lặp lại chúng:

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

Bạn cũng có thể sử dụng các thiết bị include để bao gồm mô-đun State.

Ví dụ, mô-đun Game của bạn có thể nói:

include State 
type game = state 

Trong cả hai trường hợp này, bạn có thể tham khảo Game.x:

let f g = g.Game.x 

Hoặc:

open Game 
let f g = g.x 

Có cũng có hai ký hiệu để mở một mô-đun chỉ với một biểu thức duy nhất:

let f g = Game.(g.x) 

Hoặc:

let f g = let open Game in g.x 

Edit: Dưới đây là một phiên dòng lệnh Unix cho thấy người đầu tiên (đơn giản nhất) giải pháp:

$ 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 không ai trong số những người có vẻ làm việc. ..if Tôi thử g.State.x nó nói "Unbound record field label State.x" và chèn trạng thái mở không thay đổi bất cứ điều gì – Mike

+1

Tôi đã thử nghiệm tất cả, vì vậy chúng làm việc cho tôi. Tôi giả định mỗi mô-đun là một tệp: state.ml, game.ml và test.ml. Cần biên dịch state.ml, sau đó là game.ml, sau đó test.ml. –

+0

Tôi có tệp mli cho trò chơi và tiểu bang, điều đó có ảnh hưởng đến tương tác của họ theo bất kỳ cách nào không? – Mike

Các vấn đề liên quan