2011-01-18 17 views
6

La linea guida comune di uguaglianza/membri di confronto il design è quello di non implementare l'uguaglianza strutturale tipi di riferimento mutabili, ma dare un'occhiata a F # tipi di record con i campi mutabili:uguaglianza inferenza in F # record + con campi mutabili

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! 

Il numero Map è ordinato internamente, ma i campi record mutable mi consentono di modificare l'ordine mentre l'istanza del record è già all'interno della mappa e questo è molto brutto.

Penso che F # debba dedurre le modalità [<NoEquality>] e [<NoComparison>] per i tipi di record F # che dichiarano i campi mutabili, non è vero?

risposta

5

Questa non è una posizione irragionevole.

Potrebbero esserci alcuni modi intelligenti per sfruttare questa funzione in modo utile, anche se non ci ho pensato abbastanza profondamente. Questo è fondamentalmente la stessa cosa di quando si inserisce un tipo mutabile in un Dictionary e si ottiene ciò che si merita. (Le lingue non possono impedire ogni abuso, ecco perché abbiamo linee guida per la progettazione e il giudizio del programmatore per colmare le lacune :))

In ogni caso, non è possibile cambiarlo ora.