let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
は弱いポリモーフィズムですが、ref
.
orを使わずに弱いポリモーフィズム関数を書く方法はありますref
かpartial application
?
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
は弱いポリモーフィズムですが、ref
.
orを使わずに弱いポリモーフィズム関数を書く方法はありますref
かpartial application
?
もちろん。モジュールの抽象化がそれを行い、基本的にコンパイラーに実装に関するすべての情報を破棄するように指示します。
module Example : sig
type 'a t
val create : unit -> 'a t
end = struct
type 'a t = int
let create () = 0
end
そして弱いポリモーフィックな結果:
# let x = Example.create ();;
val x : '_a Example.t = <abstr>
(ここでポリモーフィズムが必要な場合は、バリアンス アノテーションを使用して回復することに注意してください。)
(配列、可変フィールド)以外の可変構造に基づいて例を作成することも簡単ですref
が、それはほとんど同じことであるため、あまり有益ではありません。
create: unit -> 'a t
配列、bigarray、オブジェクト、および、 またはの形式の構造を持つその他の可変データ構造を使用create: some_type -> 'a t
すると、指定された型を持つことを実際にコンパイラーに証明しなくても作成できるようになります。