Sono rimasto un po 'sorpreso quando ho realizzato che il codice map
di F # implementa sia IDictionary <' Chiave ',' Valore> e ICollection<KeyValuePair<'a, 'b>>
considerando che entrambi supportano la mutazione (aggiungi e rimuovi) come parte del contratto.Perché la mappa F # implementa le interfacce con operazioni mutabili?
Guardando l'attuazione di map
si eccettua semplicemente quando si tenta di provocare mutazioni!
let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;
il codice precedente genera l'eccezione:
System.NotSupportedException: valori Mappa non possono essere mutati. a Microsoft.FSharp.Collections.FSharpMap
2.System-Collections-Generic-IDictionary
2 Aggiungere (TKey k, TValue v) a $ FSI_0007.main @(). Arrestato causa di un errore
che è come previsto.
Per una collezione immutabile essere in grado di esporre se stessa come mutabile solo per far sorgere un'eccezione quando il consumatore di quella raccolta cerca di provocare una mutazione sembra una decisione così pericolosa.
Mi manca qualcosa qui?
La funzione ['dict'] (http://msdn.microsoft.com/en-us/library/ee353774.aspx) è un altro esempio. Restituisce un _read only_ 'IDictionary <_,_>'. – Daniel