【问题标题】:How is Eq typeclass implemented for user defined types?如何为用户定义的类型实现 Eq 类型类?
【发布时间】:2013-10-21 12:37:00
【问题描述】:

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

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

【问题讨论】:

    标签: haskell typeclass


    【解决方案1】:

    就像你说的那样,它与每个可能的值构造函数进行模式匹配!例如,如果您将代码放在一个文件中并运行 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)
    

    【讨论】:

    • 你也可以在 ghci 中做:set -ddump-deriv
    • 哦,所以它专门为 Person 类型生成实例代码。我误以为使用了一些已经编写的代码。但是它怎么知道如何生成实例代码呢?这是否融入了 Haskell 本身?
    • @user782220 基本上是的,它已经融入其中。这就是为什么您只能将deriving 与某些类型类一起使用的原因。没有可能适用于任何类型的 Haskell 代码,因此您需要特定于类型的逻辑(这就是为什么相等是类型类函数,而不是多态函数的原因)。 GHC 包含生成“明显”Eq 实例的逻辑(对于具有这样一个实例的任何类型)。
    • 如果您仍然好奇,Haskell'98 报告中指定了派生实例:haskell.org/onlinereport/derived.html
    • 说它完全是内置的有点误导。使用 Template Haskell,普通人(是的,你!)可以编写为任意数据类型自动生成内容的代码。 lens 大量使用了这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2013-11-11
    • 2017-04-03
    相关资源
    最近更新 更多