2016-07-28 81 views
0

我想要聲明一個AST作爲Eq的一個實例,但不想爲每個構造函數重複相同的步驟(如果所有子項都相同,則2個expr是相同的) 。所以第一個問題是,GHC「派生」是否足夠?它有什麼作用?如果沒有,是否有一個乾淨的方法來避免重複?也許泛型編程?乾淨的方式來推導公式Eq

+1

您可以檢查(通常是相當可讀但uniquified命名)是GHC通過編譯產生的衍生的實例代碼與'-ddump-deriv'。查看GHC用戶指南的6.13.1節,查看所有可以獲得GHC的中間格式的列表。 –

回答

1

Eq返回的派生實例True兩個對象xy如果兩個以下爲真:

  • xy通過相同的數據構造產生(並因此也具有相同的字段類型)
  • xy各個字段是彼此相等(經由它們的respecitve Eq實例)

例如,考慮

data Maybe a = Nothing | Just a 

派生Eq情況是這樣的:

instance Eq a => Eq (Maybe a) where 
    Nothing == Nothing = True 
    (Just x) == (Just y) = x == y 
     _ == _  = False 
1

GHC的推導完全符合你的描述。給定一個數據類型data X = A ... | B ... | C ...它聲明瞭兩個相等的值,當它們具有相同的構造函數時,並且構造函數的所有參數也是相等的。這意味着每個構造函數的所有參數必須有一個Eq約束。如果它們是具體類型,那麼如果找不到Eq實例,則派生將在編譯時失敗。如果它們是變量,則Eq約束被傳遞到instance定義中。

相關問題