我想要聲明一個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. 如何在乾淨的方式
- 3. 以乾淨的方式重疊元素?
- 4. 一個乾淨的格式
- 5. 乾淨的方式來遍歷在Python中成對的列表?
- 6. Python:最乾淨的方式來寫元組作爲DictWriter的行?
- 7. 乾淨的方式來填充元素的內容
- 8. 乾淨的方式來編程控制iPhone上的Safari?
- 9. 最乾淨的方式來查找列表中的匹配
- 10. 乾淨的方式來移動機器之間的python 3.6 venv?
- 11. 乾淨的方式來映射node.js或JavaScript中的數組
- 12. 乾淨的方式來保存CoreData對象上的觀察者?
- 13. 乾淨的方式來結束解析的野牛分析器
- 14. 乾淨的方式來計算雅可比陣的總和
- 15. 乾淨的方式從文本文件導入數據?
- 16. 最乾淨的方式來隱藏密碼輸入字段?
- 17. c#:乾淨的方式來適應集合到多維數組?
- 18. 乾淨的方法來簡化二進制表達式樹
- 19. 乾淨的方式來映射對象到其他對象?
- 20. 乾淨的方式來滾動div divs當滾動
- 21. 一個乾淨的方式來寫循環
- 22. 最乾淨的方式來調用跨線程事件
- 23. 一個乾淨的方式來渲染東西
- 24. 最乾淨的方式來寫2布爾條件(4分支)
- 25. 乾淨的方式來有條件地呈現HTML視圖?
- 26. 乾淨的方式來實現異步indexedDB在類
- 27. 乾淨的方式來重構測試代碼
- 28. 乾淨的方式來實現活躍記錄樣式ORM的急切加載?
- 29. 使用形式乾淨(個體經營)方法來做驗證
- 30. 乾淨的方式來獲得自上次循環以來的ms?
您可以檢查(通常是相當可讀但uniquified命名)是GHC通過編譯產生的衍生的實例代碼與'-ddump-deriv'。查看GHC用戶指南的6.13.1節,查看所有可以獲得GHC的中間格式的列表。 –