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?