2011-01-18 23 views
6

Wspólna równości/członkowie porównania konstrukcja wytyczną jest nie wdrożenia równości strukturalnej na modyfikowalnych typów referencyjnych, ale przyjrzeć się F # typów płytowych z polami modyfikowalnych:Równość wnioskowanie w F + rekordy # z polami modyfikowalnych

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! 

Map jest sortowany wewnętrznie, ale pola rekordów mutable pozwalają mi zmienić kolejność, podczas gdy instancja rekordu jest już na mapie i jest to bardzo złe.

Myślę, że F # powinien wyprowadzać [<NoEquality>] i [<NoComparison>] tryby dla typów rekordów F #, które deklarują pola zmienne, czyż nie?

Odpowiedz

5

To nie jest nierozsądne stanowisko.

Możliwe, że istnieją sprytne sposoby na wykorzystanie tej funkcji w użyteczny sposób, chociaż nie zastanawiałem się nad nią wystarczająco głęboko. Jest to w zasadzie to samo, co przy wstawianiu zmiennego typu do Dictionary, a otrzymasz to, na co zasługujesz. (Języki nie mogą zapobiec każdemu niewłaściwemu użyciu, dlatego mamy wytyczne projektowe i osąd programisty, aby wypełnić luki :))

W każdym razie, nie zmieniamy tego teraz.