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
Nguồn
2012-11-26 02:46:39
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
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. –
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