2016-03-15 32 views
2

假设我们来看看:创建数据类型时派生意味着什么?

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) 

什么是 “导出(显示,公式)” 是什么意思?我有时只是看到“派生(显示)”。

回答

7

deriving关键字自动为某些类型类别“派生”实现。这仅适用于某些内置类型类别(包括ShowEq)。

Show实例deriving创建产生的构造作为字符串的名称,如果构造函数接受任何参数,的show荷兰国际集团每个参数,以逗号分隔并用括号括的结果。

所以你的类型deriving 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 

正如你可以看到,使用deriving可以节省相当多的代码。

+0

除了少数标准类外,GHC还有一些扩展用于派生其他类实例,因为大部分时间您需要编写的代码与此处显示的那样单调乏味且直接。 (评论,因为我认为这不值得张贴作为一个单独的答案或通过编辑混淆这个答案) – chepner

+0

还要注意,派生'Show'需要所有参数类型为'Show',并且派生'Eq'需要所有参数类型为'Eq',否则默认实现无法工作。 –