當我意識到F#的map
同時實現了IDictionary <'Key',Value>和ICollection<KeyValuePair<'a, 'b>>
考慮到兩者都支持作爲契約一部分的變化(添加和刪除)時,我有些驚訝。爲什麼F#map實現可變操作的接口?
看看map
的執行情況,它只是當你試圖引起突變而已!
let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;
上述代碼拋出異常:
System.NotSupportedException:地圖值不能突變。在 Microsoft.FSharp.Collections.FSharpMap
2.System-Collections-Generic-IDictionary
2-添加在(TKEY的 K,TValue v)中。$ FSI_0007.main @()停止 由於錯誤
其是如預期。
對於一個不可變的集合,只有當該集合的使用者試圖引起變異時,才能將自身暴露爲可變集合,以便引發異常,這似乎是一個非常危險的決定。
我在這裏錯過了什麼嗎?
['dict'](http://msdn.microsoft.com/en-us/library/ee353774.aspx)函數是另一個這樣的示例。它返回一個_read only_'IDictionary <_,_>'。 – Daniel