gpt4 book ai didi

f# - F# 中的快捷等式检查?

转载 作者:行者123 更新时间:2023-12-04 18:16:28 26 4
gpt4 key购买 nike

在 F# 中,相等运算符 (=) 通常是外延的,而不是内涵的。那太棒了!不幸的是,在我看来,F# 没有使用指针相等来缩短这些扩展比较。

例如,这段代码:

类型 Z = MT | Z ref 的 NMT

//创建一个 Z:
让 a = ref MT
//让它指向自己:
a := NMT a

//检查它是否等于自身:
printf "a = a: %A\n"(a = a)

... 给了我一个很大的段错误 [*],尽管 'a' 和 'a' 都评估为相同的引用。那不是很好。其他函数式语言(例如 PLT Scheme)正确地使用指针比较,在可以使用指针比较确定时返回“true”。

所以:我会接受 F# 的相等运算符不使用捷径的事实;有什么方法可以执行内涵(基于指针的)相等性检查? (==) 运算符未在我的类型上定义,如果有人能告诉我它以某种方式可用,我会很高兴。

或者告诉我我对情况的分析是错误的:我也喜欢这样......

[*] 这可能是 Windows 上的堆栈溢出;有一些关于 Mono 的东西我不太喜欢......

最佳答案

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

顺便说一句,在 .NET 上,当我运行你的代码时,我得到了一个无限循环,但没有堆栈溢出,大概是由于尾调用优化。

关于f# - F# 中的快捷等式检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2686216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com