6

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

4

1 回答 1

5

这不是不合理的立场。

可能有一些巧妙的方法可以有效地利用此功能,尽管我没有足够深入地考虑它。这基本上与将可变类型放入 a 时是相同的Dictionary,并且您会得到应得的。(语言不能防止每一次误用,这就是为什么我们有设计指南和程序员判断来填补空白:))

反正现在也改不了了。

于 2011-01-18T17:08:44.177 回答