6

对于一些用户定义的类型,例如下面的 Eq 类型类的实现如何工作?为 Int 或 Float 之类的东西编写实现很简单。但是,所有用户类型的包罗万象是如何完成的,因为它需要对每个可能的值构造函数进行模式匹配之类的事情?我不知道有任何语法可以做到这一点。

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

1 回答 1

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)
于 2013-10-21T04:37:00.673 回答