F#中的短期平等检查?

时间:2010-04-21 20:10:10

标签: f# equality

在F#中,相等运算符(=)通常是拉伸的,而不是内涵的。那很棒!不幸的是,在我看来,F#不使用指针相等来缩短这些扩展比较。

例如,这段代码:

type Z = MT | NMT of Z ref

// create a Z:
let a = ref MT
// make it point to itself:
a := NMT a

// check to see whether it's equal to itself:
printf "a = a: %A\n" (a = a)

...给了我一个很大的脂肪分割错误[*],尽管'a'和'a'都评价相同的参考。那不是那么好。其他函数语言(例如PLT Scheme)使用指针比较保守地得到这个权利,当可以使用指针比较确定它时返回'true'。

所以:我会接受F#的等式算子不使用短切的事实;有没有办法进行内涵(基于指针)的相等检查? (==)运算符没有在我的类型上定义,如果有人能告诉我它以某种方式可用,我会喜欢它。

或者告诉我,我对情况的分析是错的:我也很喜欢......

[*]这可能是Windows上的堆栈溢出;有关Mono的事情,我不喜欢......

1 个答案:

答案 0 :(得分:7)

我知道有两种选择。标准的.NET方法是使用System.Object.ReferenceEquals。在F#中稍微好一点的方法可能是使用基本相同的LanguagePrimitives.PhysicalEquality,但仅适用于引用类型(这可能适合您的目的)并且要求两个参数具有相同的静态类型。如果您想要更好的语法,还可以根据这些函数中的任何一个定义自己选择的自定义运算符。

顺便说一句,在.NET上我运行代码时会得到一个无限循环但不会出现堆栈溢出,可能是由于尾部调用优化。