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

sdg*_*sdh 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

EqualsF#中的等效实现是什么?

Tom*_*cek 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)
Run Code Online (Sandbox Code Playgroud)

  • @sdgfsdh:这是冒昧的 - C#也有元组.; - ] (3认同)
  • @sdgfsdh:对于局部变量,您不需要任何类型注释,只需使用`Tuple.Create`的类型推断.`return Tuple.Create(this.name,this.age)== Tuple.Create(other.Name,other.Age)` (3认同)