常见的相等/比较成员设计准则是不对可变引用类型实现结构相等,而是看一下具有可变字段的 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>]
模式,不是吗?