Вывод равенства в F# + записях с изменяемыми полями
Принцип разработки общих элементов равенства / сравнения состоит в том, чтобы не реализовывать структурное равенство на изменяемых ссылочных типах, а взглянуть на типы записей 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#, которые объявляют изменяемые поля, не так ли?
1 ответ
Это не необоснованная позиция.
Могут быть некоторые умные способы использовать эту функцию с пользой, хотя я не думал об этом достаточно глубоко. Это в основном то же самое, что и когда вы помещаете изменяемый тип в Dictionary
и вы получите то, что заслуживаете. (Языки не могут предотвратить любое неправильное использование, поэтому у нас есть рекомендации по дизайну и мнение программиста, чтобы заполнить пробелы:))
Во всяком случае, сейчас его нельзя изменить.