在 F# 中,等式运算符 (=) 通常是外延的,而不是内涵的。那太棒了!不幸的是,在我看来,F# 没有使用指针相等来缩短这些扩展比较。
例如,这段代码:
类型 Z = MT | Z 参考的 NMT // 创建一个 Z: 让 a = 参考 MT // 使其指向自身: 一个:= NMT // 检查它是否等于自身: printf "a = a: %A\n" (a = a)
... 给我一个很大的分段错误[*],尽管 'a' 和 'a' 都评估为相同的参考。那不是很好。其他函数式语言(例如 PLT Scheme)正确地使用指针比较,在可以使用指针比较确定时返回“真”。
所以:我会接受 F# 的相等运算符不使用捷径这一事实;有什么方法可以执行内涵(基于指针的)相等检查吗?(==) 运算符没有在我的类型上定义,如果有人能告诉我它以某种方式可用,我会很高兴。
或者告诉我,我对这种情况的分析是错误的:我也喜欢这样……
[*] 这可能是 Windows 上的堆栈溢出;Mono 有一些我不太喜欢的东西……