Haskell 在创建数据类型时,派生意味着什么?

Haskell 在创建数据类型时,派生意味着什么?,haskell,Haskell,假设我们看看: data Quadrants = Origin | Quadrant_I | Quadrant_II | Quadrant_III | Quadrant_IV | X_Axis_Positive | X_Axis_Negative | Y_Axis_Positive | Y_Axis_Negative deriving (Show, Eq) “衍生(表演、情商)”是什么意思?我有时只看“衍生(表演)” 派生

假设我们看看:

data Quadrants = Origin |
                 Quadrant_I | Quadrant_II | Quadrant_III | Quadrant_IV |
                 X_Axis_Positive | X_Axis_Negative | Y_Axis_Positive | Y_Axis_Negative
  deriving (Show, Eq)

“衍生(表演、情商)”是什么意思?我有时只看“衍生(表演)”

派生关键字自动“派生”特定类型类的实现。这仅适用于某些内置类型类(包括
Show
Eq

派生
创建的
Show
实例将以字符串形式生成构造函数的名称,如果构造函数接受任何参数,则
Show
的结果将对每个参数进行排序,以逗号分隔,并用括号括起来

因此,对于您的类型
派生,Show
将等效于以下实例:

instance Show Quadrants where
    show Origin = "Origin"
    show Quadrant_I = "Quadrant_I"
    show Quadrant_II = "Quadrant_II"
    ...
类似地,如果使用相同的构造函数和参数创建两个值,则派生的
Eq
实例会认为这两个值相等。因此,对于您的类型,应该是:

instance Eq Quadrants where
    Origin == Origin = True
    Quadrant_I == Quadrant_I = True
    Quadrant_II == Quadrant_II = True
    ...
    _ == _ = False

如您所见,使用
派生
可以节省大量代码。

GHC还提供了一些扩展,用于派生除少数标准类之外的其他类实例,因为您需要编写的代码大部分时间都像这里所示的那样繁琐和简单。(评论是因为我认为这不值得作为一个单独的答案发布,也不值得将此答案与编辑混淆。)还要注意,派生
Show
要求所有参数类型都是
Show
,而派生
Eq
要求所有参数类型都是
Eq
,否则默认实现无法工作。