let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
是弱多態性,但涉及ref
。是否有可能編寫弱多態函數而不涉及引用或部分應用程序?
任何編寫弱多態性函數的方法沒有涉及ref
或partial application
?
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
是弱多態性,但涉及ref
。是否有可能編寫弱多態函數而不涉及引用或部分應用程序?
任何編寫弱多態性函數的方法沒有涉及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
(數組,可變字段)之外,還可以很容易地構建基於可變結構的示例,但這不是很有教育意義,因爲它幾乎是一回事。
這是可能與其它可變數據結構,像陣列,bigarray,對象,和其他結構,即具有形式create: unit -> 'a t
,或create: some_type -> 'a t
的構造,使得它們可在不實際證明一個編譯器被創建,它們將有一個指定的類型。
值得指出的是,價值限制並沒有在任何地方提及'ref'。關於'ref'沒有什麼特別的地方,除了(在寬鬆的價值限制下)它在子類型方面是不變的。 – 2014-10-11 16:41:48
'ref'在SML中更爲特殊,這是最初提出價值限制的環境。在SML記錄不可變,只有'ref's(和數組?)是。因此,關於價值限制的很多討論自然涉及'ref'。當然,在OCaml中,'ref'只是一個帶有可變字段的記錄的實例。 – gsg 2014-10-11 17:17:22