对于某些用户定义的类型,如下所示,Eq类型类的实现如何工作?为Int或Float之类的东西编写实现很简单。但是如何完成所有用户类型的捕获,因为它需要对每个可能的值构造函数进行模式匹配等操作?我不知道有任何语法可以做到这一点。
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
} deriving (Eq)
答案 0 :(得分:6)
它模式匹配每个可能的值构造函数,就像你说的那样!例如,如果您将代码放在一个文件中并使用ghc
运行-ddump-deriv
,那么这就是您所获得的:
==================== 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)