如何为F#类实现结构Equals?

时间:2016-08-13 11:10:50

标签: f# equality

在C#中,我将为具有结构相等性的类实现Equals,如下所示:

public override bool Equals(object obj)
{
    if (this == obj)
    {
        return true;
    }

    var other = obj as MyType;
    if (other != null)
    {
        return someField == other.someField && 
            someOtherField == other.someOtherField;
    }

    return false;
}

在F#中,我们有这方面的记录,但是如果我们想要使用继承,则必须实现type

F#中的等效Equals实现是什么?

1 个答案:

答案 0 :(得分:16)

如评论中所述,您只需覆盖Equals即可。编译器还会告诉您覆盖GetHashCode是个好主意。

一个巧妙的技巧是,您可以获取类的所有相关字段,使用它们创建元组,然后比较元组(或获取元组的哈希码)。这使得实现比手动执行操作更容易:

type Person(name:string, age:int) =
  member x.Name = name
  member x.Age = age
  override x.GetHashCode() =
    hash (name, age)
  override x.Equals(b) =
    match b with
    | :? Person as p -> (name, age) = (p.Name, p.Age)
    | _ -> false

Person("Joe", 42) = Person("Joe", 42)