2013-10-21 19 views
6

Đối với một số loại người dùng xác định như dưới đây như thế nào việc thực hiện các công cụ đánh máy Eq? Nó đơn giản để viết một thực hiện cho những thứ như Int hoặc Float. Nhưng làm thế nào là catchall cho tất cả các loại người dùng được thực hiện vì nó sẽ cần phải làm những việc như mô hình phù hợp với mọi constructor giá trị có thể? Tôi không biết cú pháp nào để làm điều này.Eq typeclass được triển khai như thế nào cho các loại do người dùng xác định?

data Person = Person { firstName :: String 
        , lastName :: String 
        , age :: Int 
        } deriving (Eq) 

Trả lời

6

Mẫu khớp với mọi trình tạo giá trị có thể, giống như bạn đã nói! Ví dụ, nếu bạn đặt mã của bạn trong một tập tin và chạy ghc với -ddump-deriv, đây là những gì bạn nhận được:

==================== Derived instances ==================== 
Derived instances: 
    instance GHC.Classes.Eq Main.Person where 
    GHC.Classes.== 
     (Main.Person a1_alh a2_ali a3_alj) 
     (Main.Person b1_alk b2_all b3_alm) 
     = ((((a1_alh GHC.Classes.== b1_alk)) 
      GHC.Classes.&& ((a2_ali GHC.Classes.== b2_all))) 
     GHC.Classes.&& ((a3_alj GHC.Classes.== b3_alm))) 
    GHC.Classes./= a_aln b_alo 
     = GHC.Classes.not ((GHC.Classes.==) a_aln b_alo) 
+0

Bạn có thể làm ': set -ddump-deriv' trong ghci quá –

+1

Oh vậy nó tạo ra các mã ví dụ cụ thể cho loại Người. Tôi đã bị ấn tượng sai lầm rằng một số mã đã viết được sử dụng. Nhưng làm sao nó biết cách tạo mã thể hiện? Đó có phải là tự nướng vào Haskell không? – user782220

+1

@ user782220 Về cơ bản có, nó được nướng. Đó là lý do tại sao bạn chỉ có thể sử dụng 'deriving' với một số kiểu lớp nhất định. Không có mã Haskell có thể làm việc cho bất kỳ loại nào, vì vậy bạn cần logic cụ thể loại (đó là lý do tại sao sự bình đẳng là một hàm kiểu lớp, không phải là một hàm đa hình). GHC chứa logic để tạo ra cá thể "Eq'" rõ ràng (cho bất kỳ kiểu nào * có * một thể hiện như vậy). – Ben

Các vấn đề liên quan