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#记录类型的模式,不是吗?
这不是一个不合理的立场.
可能有一些聪明的方法可以有效地利用这个功能,虽然我没有深入考虑它.这与将一个可变类型放入a中的方式基本相同Dictionary,并且得到了你应得的.(语言无法阻止每次滥用,这就是为什么我们有设计指南和程序员判断填补空白:))
无论如何,现在没有改变它.