2011-01-18 7 views
6

La pauta de igualdad común/miembros de comparación de diseño es la de no poner en práctica la igualdad estructural sobre los tipos de referencia mutable, pero echa un vistazo a F # tipos de registro con campos variables:Igualdad inferencia en F registros # + con campos mutables

type Value = { mutable value: int } 

let mutableRecord = { value = 1 } 
let xs = Map.ofList [ mutableRecord, "abc" 
         { value = 2 }, "def" ] 

let abc = Map.find { value=1 } xs 
mutableRecord.value <- 3 
let abc = Map.find { value=3 } xs // KeyNotFoundException! 

El Map está ordenado internamente, pero los campos de registro mutable me permiten cambiar el orden mientras la instancia de registro ya está dentro del mapa y esto es muy malo.

Creo que F # debería inferir los modos [<NoEquality>] y [<NoComparison>] para los tipos de registro F # que declaran los campos mutables, ¿no?

Respuesta

5

Esa no es una postura irrazonable.

Puede haber algunas formas inteligentes de aprovechar esta característica de manera útil, aunque no he pensado lo suficiente. Esto es básicamente lo mismo que cuando pones un tipo mutable en un Dictionary, y obtienes lo que mereces. (Los idiomas no pueden evitar cada uso indebido, y es por eso que tenemos pautas de diseño y juicio del programador para llenar los vacíos :))

De todos modos, no hay cambio ahora.

Cuestiones relacionadas