Вывод равенства в F # + записях с изменяемыми полями - PullRequest
6 голосов
/ 18 января 2011

Общее руководство по созданию элементов равенства / сравнения состоит в том, чтобы не реализовывать структурное равенство на изменяемых ссылочных типах, а взглянуть на типы записей 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 Ответ

5 голосов
/ 18 января 2011

Это не необоснованная позиция.

Могут быть некоторые умные способы использовать эту функцию с пользой, хотя я не думал об этом достаточно глубоко.Это в основном то же самое, что когда вы помещаете изменяемый тип в Dictionary, и вы получаете то, что заслуживаете.(Языки не могут предотвратить любое неправильное использование, поэтому у нас есть рекомендации по дизайну и суждения программиста, чтобы заполнить пробелы :))

В любом случае, сейчас нет изменений.

...