在 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 方案)通过保守地使用指针比较来实现这一点,当可以使用指针比较确定时返回“true”。
所以:我会接受 F# 的相等运算符不使用快捷方式的事实;有没有某种方法可以执行内涵(基于指针)的相等性检查? (==) 运算符没有在我的类型上定义,如果有人能告诉我它以某种方式可用,我会很高兴。
或者告诉我我对情况的分析是错误的:我也喜欢这样......
[*] 这可能是 Windows 上的堆栈溢出; Mono 有一些我不太喜欢的东西......
我知道有两个选择。标准 .NET 方法是使用System.Object.ReferenceEquals
。 F# 中稍微好一点的方法可能是使用LanguagePrimitives.PhysicalEquality
它基本上是相同的,但仅适用于引用类型(这可能适合您的目的)并且要求两个参数具有相同的静态类型。如果您想要更好的语法,您还可以根据这些函数之一定义您选择的自定义运算符。
顺便说一句,在 .NET 上,当我运行代码时,我遇到了无限循环,但没有出现堆栈溢出,这可能是由于尾部调用优化所致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)