F#中的短切相等性检查?
在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) 类型Z=MT | NMT的Z参考 //创建一个Z: 设a=ref MT //让它指向自己: a:=NMT a //检查它是否等于自身: printf“a=a:%a\n”(a=a) 。。。尽管“a”和“a”的计算结果都是同一个引用,但这给了我一个很大的分段错误[*]。那不太好。其他函数式语言(如PLT Scheme)通过保守地使用指针比较,在可以使用指针比较确定时返回“true” 所以:我接受这样一个事实,即F#的相等运算符不使用快捷方式;是否有某种方法可以执行内涵(基于指针的)相等性检查?在我的类型中没有定义(=)运算符,如果有人能告诉我它是可用的,我会很高兴 或者告诉我,我对形势的分析是错误的:我也希望如此F#中的短切相等性检查?,f#,equality,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) 类型Z=MT
[*]这可能是Windows上的堆栈溢出;关于单声道,有些东西我不太喜欢…我知道有两种选择。标准的.NET方法是使用
System.Object.ReferenceEquals
。F#中的一个稍好的方法可能是使用LanguagePrimitives.PhysicalQuality
,它基本相同,但只适用于引用类型(这对于您的目的可能是正确的),并且要求两个参数具有相同的静态类型。如果您想要更好的语法,还可以根据这些函数中的任何一个定义您选择的自定义运算符
另外,在.NET上运行代码时,我得到了一个无限循环,但没有堆栈溢出,这可能是由于尾部调用优化。谢谢!顺便说一句:是的,这确实会在mono/osx上转储内核。也许在我使用的mono/fsharp的特定组合中,尾部调用没有正确地实现平等性检查。