2012-06-09 41 views
8

Tôi có một loại bản ghi trong đó bao gồm một chức năng:Kết cấu bình đẳng trong F #

{foo : int; bar : int -> int} 

Tôi muốn loại này để có sự bình đẳng về cơ cấu. Có cách nào tôi có thể chỉ cần đánh dấu rằng bar nên được bỏ qua trong các bài kiểm tra bình đẳng? Hoặc là có một số cách khác xung quanh điều này?

Trả lời

17

Xem Don's blog đăng bài về chủ đề này, cụ thể là phần Tuỳ chỉnh bình đẳng và so sánh.

Ví dụ ông cho là gần giống như cấu trúc lại được đề xuất:

/// 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" 
7

Để trả lời cụ thể hơn câu hỏi ban đầu của bạn, bạn có thể tạo một kiểu tùy chỉnh so sánh mà giữa các trường luôn luôn đúng:

[<CustomEquality; NoComparison>] 
type StructurallyNull<'T> = 
    { v: 'T } 

    override x.Equals(yobj) = 
     match yobj with 
     | :? StructurallyNull<'T> as y -> true 
     | _ -> false 

    override x.GetHashCode() = 0 

type MyType = { 
    foo: int; 
    bar: StructurallyNull<int -> int> 
} 
+1

+1 quảng cáo :-) –