Tôi đã hơi ngạc nhiên khi tôi nhận ra rằng F # 'map
thực hiện cả hai IDictionary <' Key, 'Value> và ICollection<KeyValuePair<'a, 'b>>
xem xét cả hai hỗ trợ đột biến (thêm và loại bỏ) như là một phần của hợp đồng.Tại sao F # map thực hiện các giao diện với các hoạt động có thể thay đổi?
Nhìn vào việc thực hiện map
nó chỉ đơn giản là excepts khi bạn cố gắng gây ra đột biến!
let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;
mã ở trên ném ngoại lệ:
System.NotSupportedException: giá trị Bản đồ không thể bị đột biến. tại Microsoft.FSharp.Collections.FSharpMap
2.System-Collections-Generic-IDictionary
2 Thêm (TKey k, TValue v) tại. $ FSI_0007.main @() Ngưng do lỗi
đó là như mong đợi.
Đối với bộ sưu tập không thể thay đổi để có thể vạch trần chính nó như một bộ phận có thể thay đổi chỉ để loại trừ ngoại lệ khi người tiêu dùng bộ sưu tập đó gây ra đột biến có vẻ như là một quyết định nguy hiểm.
Tôi có thiếu gì đó ở đây không?
Hàm ['dict'] (http://msdn.microsoft.com/en-us/library/ee353774.aspx) là một ví dụ khác. Nó trả về một _read only_ 'IDictionary <_,_>'. – Daniel