2016-03-15 57 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',否則默認實現無法工作。 –