2013-10-21 10 views
6

Aşağıdaki gibi bazı kullanıcı tanımlı türler için Eq tipinde yazım denetimi nasıl çalışır? Int veya Float gibi şeyler için bir uygulama yazmak basit. Ancak, tüm olası kullanıcı yapıcılara karşı desen eşlemesi gibi şeyler yapması gerekeceği için, tüm kullanıcı türleri için catchall nasıl yapılır? Bunu yapmak için herhangi bir sözdiziminin farkında değilim.Eq typeclass kullanıcı tanımlı türler için nasıl uygulanır?

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

cevap

6

Bu desen, dediğiniz gibi her olası değer yapıcısına karşı eşleşir!

==================== 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) 
Sen `yapabilirsiniz
+0

: GHCi çok –

+1

Ah ayarlanan -ddump-deriv' o örneği kodunu üretir böylece bir dosyaya kodunuzu koymak ve eğer Örneğin, -ddump-deriv ile ghc çalıştırın burada ne olsun Özellikle kişi tipi için. Yanlış yazılmış bazı kodların kullanıldığı izlenimindeyim. Fakat örnek kodun nasıl oluşturulacağını nasıl biliyor? Bu Haskell'in içine mi fırladı? – user782220

+1

@ user782220 Temel olarak evet, fırında pişiriliyor. Bu nedenle, yalnızca türetmeyi belirli tür sınıflarıyla kullanabiliyorsunuz. Herhangi bir tür için çalışabilecek olası bir Haskell kodu yoktur, bu nedenle, türe özgü mantığa ihtiyacınız vardır (bu yüzden eşitlik, bir polimorfik fonksiyon değil, tip sınıfı bir işlevdir). GHC, “bariz” Eq ”örneğini (* bu tür bir örneğe sahip olan herhangi bir tür) oluşturmak için mantık içerir. – Ben