5

モジュール状態に型がある場合

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

モジュールGameに別のタイプがあります

type game = State.state

ゲーム型のオブジェクトのレコード値にアクセスするにはどうすればよいですか?

たとえば、ゲーム "g" がある場合、gx は "Unbound record field label x" エラーを返します。

4

1 に答える 1

9

フィールドの名前は、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

単一の式だけのモジュールを開くための 2 つの表記法もあります。

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
于 2012-11-26T02:46:39.287 に答える