爲什麼將派生Read,Show放在底下以及它們做什麼是一個好主意?當您在Haskell中定義代數數據類型時
回答
Read
,Show
,Eq
和朋友是typeclasses。基本上它們是可以實現某些功能的接口,如show
,read
,==
等等。你提到的兩個,Show
和Read
定義了你的類型的兩個函數。
read :: String -> YourType
show :: YourType -> String
事實上,其實際作用是產生一個類型類的實例,讓您使用read
和show
因爲如果他們有這些類型。
讓deriving
處理這件事通常不錯,因爲它只是樣板,常常用於調試。通常你只是想打印出來,deriving Show
給你一個很好的方法來做到這一點。
實質上,deriving
只是讓編譯器爲您生成代碼的一種方式。這對於Eq
,Ord
和Bounded
尤其有用,您可以輕鬆地創建一個微不足道的錯誤,該錯誤非常難以調試。
當您定義自己的數據類型時,通常會有大量的樣板類的樣板代碼,您並不想自行編寫代碼。編譯器通常可以爲你解決這個問題。
舉例來說,如果你有型
data Direction = North | South | East | West
你不會是能夠做到
if direction == North then ...
因爲你還沒有書面的Eq
實例爲Direction
。你可以寫
instance Eq Direction where
North == North = True
South == South = True
East == East = True
West == West = True
_ == _ = False
但是這6行額外的代碼,真的不幫你或別人理解你的代碼。類似Show
,Ord
,Enum
,Bounded
,Bounded
,Read
和Functor
等類,這些都需要寶貴的時間和精力來編寫,因爲編譯器自己弄清楚它們是非常微不足道的。這就是deriving
條款出現的地方。我提到的所有類型類都是可導出的(儘管Functor
需要GHC中的DeriveFunctor
擴展名),並且還有其他一些類。它所做的就是指示編譯弄清楚這些類型類本身的實現,所以
data Direction = North | South | East | West
deriving (Eq, Ord, Enum, Bounded, Show, Read)
會產生大量的代碼,你可以寫自己,但沒有多少樂趣這樣做。如果需要,您可以看到通過使用-ddump-deriv
標誌進行編譯生成的代碼,但它不會很漂亮,因爲它是編譯器生成的。
實例派生是Haskell中的一個強大功能,它使編譯器自動爲您創建的類型創建一些類型類的合理實例。通常情況下,對於Eq
,Ord
,Show
,Read
,Enum
和Bounded
之類的東西,編譯器可以猜測這些東西是合理的默認實例。例如,Eq
有限和類型。
從而推導減少了大量的樣板什麼時候適合。共獲得被認爲是Haskell中的核心功能和它既有被編譯器擴展像GeneralizedNewtypeDeriving
,DeriveFunctor
,DeriveFoldable
,DeriveTraversable
,DeriveGeneric
,並DeriveDataTypeable
延伸,並通過使用Generics
導出和TemplateHaskell
自動生成實例社區涵蓋。
舉例來說,如果你使用aeson
哈斯克爾-JSON數據綁定庫,你會經常看到的模板哈斯克爾
deriveJSON ''MyType
自動創建兩個ToJSON
和FromJSON
實例。
綜合起來,這些都是確保只有代碼中最重要和特定部分必須寫入的方法。派生實例往往是「最簡單的可能實例」,因此可能具有最少的令人驚訝的行爲。與這些默認值相比較小的偏差可以在它們形成功能的基礎層之後被更直接地編碼。
- 1. Haskell返回自定義數據類型
- 2. Haskell自定義數據類型
- 3. 常量在Haskell代數數據類型
- 4. Haskell中自定義數據類型的代碼
- 5. 在OO中指定數據類型Haskell
- 6. haskell中的代數類型
- 7. Haskell自定義數學類型和類
- 8. 如何在Haskell中定義Lispy數據類型?
- 9. 類型類Haskell中的數據類型
- 10. Haskell定義類型
- 11. 類型/種類Haskell(也許)在代數數據類型中的混淆
- 12. Haskell錯誤代數類型
- 13. 如何在Haskell中爲代數數據類型實現「Ord」?
- 14. 訪問自定義Haskell數據類型的函數
- 15. Haskell:定義一個函數範圍的新數據類型
- 16. 評估Haskell數據類型中的未定義元素
- 17. 使用自定義數據類型在Haskell
- 18. 生成一個用戶定義的數據類型在Haskell
- 19. haskell自己的數據類型 - 在數據類型定義中使用符號或數字
- 20. 在Haskell中使用數據類型
- 21. 在Haskell中繼承數據類型?
- 22. 在Haskell中導入數據類型
- 23. 在Python中定義代數數據類型的最佳方法?
- 24. 是否有使用代數數據類型的Haskell數據庫?
- 25. Haskell - 組合數據類型?
- 26. Haskell數據類型困境
- 27. 在Haskell中爲自定義數據類型創建Read type類的實例
- 28. 在rapidminer中定義序數據類型
- 29. 在OCL中定義數據類型
- 30. Haskell代數類型和函數轉換
忘記了DeriveGeneric – jozefg
是的 - 我現在加了! –