我想要聲明一個AST作爲Eq的一個實例,但不想爲每個構造函數重複相同的步驟(如果所有子項都相同,則2個expr是相同的) 。所以第一個問題是,GHC「派生」是否足夠?它有什麼作用?如果沒有,是否有一個乾淨的方法來避免重複?也許泛型編程?乾淨的方式來推導公式Eq
0
A
回答
1
的Eq
返回的派生實例True
兩個對象x
和y
如果兩個以下爲真:
x
和y
通過相同的數據構造產生(並因此也具有相同的字段類型)- 的
x
和y
各個字段是彼此相等(經由它們的respecitveEq
實例)
例如,考慮
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
定義中。
相關問題
- 1. 乾淨的方式來篩選列表
- 2. 最乾淨的方式來導入/需要一個Vue.js指令?
- 3. 以乾淨的方式重疊元素?
- 4. 如何在乾淨的方式
- 5. 一個乾淨的格式
- 6. 乾淨的方式來映射node.js或JavaScript中的數組
- 7. 乾淨的方式來填充numpy陣列的第三維
- 8. 乾淨的方式來測試不同值的許多條件?
- 9. 乾淨的方式來遍歷在Python中成對的列表?
- 10. 乾淨的方式來填充元素的內容
- 11. 乾淨的方式來移動機器之間的python 3.6 venv?
- 12. 乾淨的方式來結束解析的野牛分析器
- 13. 乾淨的方式來計算雅可比陣的總和
- 14. 最乾淨的方式來查找列表中的匹配
- 15. 乾淨的方式來保存CoreData對象上的觀察者?
- 16. 乾淨的方式從文本文件導入數據?
- 17. 最乾淨的方式來建立一個後備鏈?
- 18. 乾淨的方式來停止RMI服務器
- 19. 乾淨的方式來有條件地呈現HTML視圖?
- 20. 一個乾淨的方式來寫循環
- 21. 最乾淨的方式來寫2布爾條件(4分支)
- 22. 最乾淨的方式來確定是否存在一行?
- 23. .NET實體框架,乾淨的方式來實現它?
- 24. 乾淨的方法來簡化二進制表達式樹
- 25. 乾淨的方式來映射對象到其他對象?
- 26. 乾淨的方式來滾動div divs當滾動
- 27. 乾淨的方式來禁用`__setattr__`,直到初始化後
- 28. 最乾淨的方式來重置表格
- 29. 最乾淨的方式來隱藏密碼輸入字段?
- 30. 乾淨的方式來包裝和處理RMySQL連接?
您可以檢查(通常是相當可讀但uniquified命名)是GHC通過編譯產生的衍生的實例代碼與'-ddump-deriv'。查看GHC用戶指南的6.13.1節,查看所有可以獲得GHC的中間格式的列表。 –