0
let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)

は弱いポリモーフィズムですが、ref.

orを使わずに弱いポリモーフィズム関数を書く方法はありますrefpartial application?

4

2 に答える 2

4

もちろん。モジュールの抽象化がそれを行い、基本的にコンパイラーに実装に関するすべての情報を破棄するように指示します。

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が、それはほとんど同じことであるため、あまり有益ではありません。

于 2014-10-11T12:33:33.893 に答える
1

create: unit -> 'a t配列、bigarray、オブジェクト、および、 またはの形式の構造を持つその他の可変データ構造を使用create: some_type -> 'a tすると、指定された型を持つことを実際にコンパイラーに証明しなくても作成できるようになります。

于 2014-10-11T12:36:29.430 に答える