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

时间:2011-01-18 16:39:22

标签: f# comparison equality mutable inference

常见的相等/比较成员设计指南是不在可变引用类型上实现结构相等,而是查看具有可变字段的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#应该推断出声明可变字段的F#记录类型的[<NoEquality>][<NoComparison>]模式,不是吗?

1 个答案:

答案 0 :(得分:5)

这不是一种不合理的立场。

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

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