Общее руководство по созданию элементов равенства / сравнения состоит в том, чтобы не реализовывать структурное равенство на изменяемых ссылочных типах, а взглянуть на типы записей F # с изменяемыми полями:
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
отсортировано внутри, но mutable
поля записи позволяют мне изменять порядок, когда экземпляр записи уже находится внутри карты, и это очень плохо.
Я думаю, что F # должен выводить [<NoEquality>]
и [<NoComparison>]
режимы для типов записей F #, которые объявляют изменяемые поля, не так ли?