Вывод равенства в 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и вы получите то, что заслуживаете. (Языки не могут предотвратить любое неправильное использование, поэтому у нас есть рекомендации по дизайну и мнение программиста, чтобы заполнить пробелы:))

Во всяком случае, сейчас его нельзя изменить.

Другие вопросы по тегам