.net 如何实现结构的比较? [] 将节点键入为y->比较符号y。符号 |->failwith“节点的比较无效。”

.net 如何实现结构的比较? [] 将节点键入为y->比较符号y。符号 |->failwith“节点的比较无效。”,.net,f#,.net,F#,上述方法不起作用,错误消息让我感到困惑。我正在使用节点类来保存AST中的其他节点,我想知道将其转换为结构是否会加快我正在使用的编译器的速度 该类型在没有I可比较界面的情况下进行类型检查,因此我特别询问比较。“错误消息让我感到困惑”-如果您提供了错误消息,我们将能够更好地向您解释。对。那么你应该在问题中包括这一点。(但是对于非节点,您的Equals方法应该只返回false,而不是失败。)我想我刚才已经解决了这个问题。一旦我添加了CustomEqualityAttribute它就会进行typeche

上述方法不起作用,错误消息让我感到困惑。我正在使用
节点
类来保存AST中的其他节点,我想知道将其转换为结构是否会加快我正在使用的编译器的速度


该类型在没有
I可比较
界面的情况下进行类型检查,因此我特别询问比较。

“错误消息让我感到困惑”-如果您提供了错误消息,我们将能够更好地向您解释。对。那么你应该在问题中包括这一点。(但是对于非节点,您的
Equals
方法应该只返回
false
,而不是失败。)我想我刚才已经解决了这个问题。一旦我添加了
CustomEqualityAttribute
它就会进行typechecks.Goodo。不过,在github上报告这一点可能值得一提,因为它是一条奇怪的错误消息。Structs不是一个“更快”按钮。它们对某些应用程序有好处,对其他应用程序则有坏处。在决定使用结构之前,您需要测量时间的流逝。
[<Struct;CustomComparison>]
type Node<'a>(expr:'a, symbol:int) = 
    member x.Expression = expr
    member x.Symbol = symbol
    override x.ToString() = sprintf "%A" expr
    override x.GetHashCode() = symbol
    override x.Equals(y) = 
        match y with 
        | :? Node<'a> as y -> symbol = y.Symbol
        | _ -> failwith "Invalid equality for Node."

    interface IComparable with
        member x.CompareTo(y) = 
            match y with
            | :? Node<'a> as y -> compare symbol y.Symbol
            | _ -> failwith "Invalid comparison for Node."