具有可变字段的F#+记录中的平等推断

con*_*low 6 comparison f# inference equality mutable

常见的相等/比较成员设计指南是不在可变引用类型上实现结构相等,而是查看具有可变字段的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!
Run Code Online (Sandbox Code Playgroud)

Map是内部排序的,但是mutable记录字段允许我更改排序,而记录实例已经在map中,这非常糟糕.

我认为F#应该推断[<NoEquality>][<NoComparison>]声明可变字段的F#记录类型的模式,不是吗?

Bri*_*ian 5

这不是一个不合理的立场.

可能有一些聪明的方法可以有效地利用这个功能,虽然我没有深入考虑它.这与将一个可变类型放入a中的方式基本相同Dictionary,并且得到了你应得的.(语言无法阻止每次滥用,这就是为什么我们有设计指南和程序员判断填补空白:))

无论如何,现在没有改变它.