私はOcamlで実装しようとしているこのOOの状況を持っています:2つのクラスX1
とX2
、両方ともサブタイピングX
(X1 <: X
と)であり、またはのいずれかになるX2 <: X
を動的に返す関数を書きたいです。X
X1
X2
しかし、通常はOcamlのクラスを避けて代わりにモジュールを使用するのが良いと聞いたので、このように問題を表現しようとしています(過度に単純化されていますが、それでも重要です):2つのモジュールX1
とX2
、そして関数が動的にどちらかを決定するようにしたいX1.t
またはのいずれかを返しますX2.t
。
module type X = sig
type choice
type t
(* some methods we don't care about in this instance, like
val modifySomething : t -> t *)
end
module Xbase = struct
type choice = Smth | SmthElse
end
module X1 = (
struct
include Xbase
type t = { foo : int; bar : int }
end : X)
module X2 = (
struct
include Xbase
type t = { foo : int; star : int }
end : X)
module XStatic =
struct
(* construct either an X1.t or X2.t from the string *)
let read : string -> 'a =
function
| "X1" -> { X1.foo = 0, bar = 0 }
| "X2" -> { X2.foo = 1, star = 1 }
end
しかし、これError: Unbound record field label X1.foo
はread
関数で失敗します。私はそれを使用するなど、それを配置するさまざまな方法を試しましlet open X1 in { foo = 0, ... }
たが、役に立たなかった。
これに対する私のアプローチは根本的に間違っていますか(つまり、これはモジュールでは不可能/非実用的であるため、クラスを使用する必要があります)、それとも些細なことを見逃しているだけですか?
編集:私が解決しようとしている問題を明確にし、それをと区別するために名前を変更module X
しました。module XBase
module type X