在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的事情,我不喜欢......
答案 0 :(得分:7)
我知道有两种选择。标准的.NET方法是使用System.Object.ReferenceEquals
。在F#中稍微好一点的方法可能是使用基本相同的LanguagePrimitives.PhysicalEquality
,但仅适用于引用类型(这可能适合您的目的)并且要求两个参数具有相同的静态类型。如果您想要更好的语法,还可以根据这些函数中的任何一个定义自己选择的自定义运算符。
顺便说一句,在.NET上我运行代码时会得到一个无限循环但不会出现堆栈溢出,可能是由于尾部调用优化。