Structural Equality in F#

f#, structural-equality

Solution

See Don's blog post on this topic, specifically the section Custom Equality and Comparison.

The example he gives is almost identical to the record structure you propose:

/// A type abbreviation indicating we’re using integers for unique stamps on objects
type stamp = int
 
/// A type containing a function that can’t be compared for equality  
 [<CustomEquality; CustomComparison>]
type MyThing =
    { Stamp: stamp;
      Behaviour: (int -> int) } 
 
    override x.Equals(yobj) =
        match yobj with
        | :? MyThing as y -> (x.Stamp = y.Stamp)
        | _ -> false
 
    override x.GetHashCode() = hash x.Stamp
    interface System.IComparable with
      member x.CompareTo yobj =
          match yobj with
          | :? MyThing as y -> compare x.Stamp y.Stamp
          | _ -> invalidArg "yobj" "cannot compare values of different types"

Problem

I have a record type that includes a function: ``` {foo : int; bar : int -> int} ``` I want this type to have structural equality. Is there some way I can just mark that the `bar` should be ignored in equality tests? Or is there some other way around this?

Original source