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

是弱多態性,但涉及ref是否有可能編寫弱多態函數而不涉及引用或部分應用程序?

任何編寫弱多態性函數的方法沒有涉及refpartial application

+3

值得指出的是,價值限制並沒有在任何地方提及'ref'。關於'ref'沒有什麼特別的地方,除了(在寬鬆的價值限制下)它在子類型方面是不變的。 – 2014-10-11 16:41:48

+0

'ref'在SML中更爲特殊,這是最初提出價值限制的環境。在SML記錄不可變,只有'ref's(和數組?)是。因此,關於價值限制的很多討論自然涉及'ref'。當然,在OCaml中,'ref'只是一個帶有可變字段的記錄的實例。 – gsg 2014-10-11 17:17:22

回答

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(數組,可變字段)之外,還可以很容易地構建基於可變結構的示例,但這不是很有教育意義,因爲它幾乎是一回事。

1

這是可能與其它可變數據結構,像陣列,bigarray,對象,和其他結構,即具有形式create: unit -> 'a t,或create: some_type -> 'a t的構造,使得它們可在不實際證明一個編譯器被創建,它們將有一個指定的類型。

相關問題