Me sorprendió un poco que me di cuenta de que F # 'map
implementa IDictionary <' Clave ', Valor> y ICollection<KeyValuePair<'a, 'b>>
teniendo en cuenta que ambos admiten la mutación (agregar y eliminar) como parte del contrato.¿Por qué el mapa F # implementa las interfaces con operaciones mutables?
En cuanto a la implementación de map
¡simplemente se exceptúa cuando intentas causar una mutación!
let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;
el código anterior produce la excepción:
System.NotSupportedException: Mapa valores no pueden ser mutados. en Microsoft.FSharp.Collections.FSharpMap
2.System-Collections-Generic-IDictionary
2-Añadir (TKey k, TValue v) a $ FSI_0007.main @(). Detenido debido a un error
que es como se esperaba.
Para que una colección inmutable pueda exponerse como mutable solo para emitir excepciones cuando el consumidor de esa colección intenta causar una mutación parece una decisión tan peligrosa.
¿Falta algo aquí?
La función ['dict'] (http://msdn.microsoft.com/en-us/library/ee353774.aspx) es otro ejemplo. Devuelve un _read only_ 'IDictionary <_,_>'. – Daniel