Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#中的短切相等性检查?_F#_Equality - Fatal编程技术网

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

在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#的相等运算符不使用快捷方式;是否有某种方法可以执行内涵(基于指针的)相等性检查?在我的类型中没有定义(=)运算符,如果有人能告诉我它是可用的,我会很高兴

或者告诉我,我对形势的分析是错误的:我也希望如此


[*]这可能是Windows上的堆栈溢出;关于单声道,有些东西我不太喜欢…

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


另外,在.NET上运行代码时,我得到了一个无限循环,但没有堆栈溢出,这可能是由于尾部调用优化。

谢谢!顺便说一句:是的,这确实会在mono/osx上转储内核。也许在我使用的mono/fsharp的特定组合中,尾部调用没有正确地实现平等性检查。