Algebraiczne typy danych (ADTS) w Haskell może automatycznie stają się przypadki niektóre typeclasse s (jakShow
,Eq
) poprzez wynikające z nich.
data Maybe a = Nothing | Just a
deriving (Eq, Ord)
Moje pytanie brzmi: jak to deriving
działa, tj. Skąd Haskell wie, jak zaimplementować funkcje wyprowadzonej typeklasy dla wyprowadzającego ADT?
Ponadto, dlaczego deriving
ogranicza się tylko do niektórych typeklas? Dlaczego nie mogę napisać własnej typeklasy, którą można wyprowadzić?
źródło
StandaloneDeriving
w podręczniku ghc i haskellwikiZ raportu Haskell 98:
Oto opis sposobu wyprowadzenia tych klas typów: http://www.haskell.org/onlinereport/derived.html#derived-appendix
źródło
Możliwe jest użycie Template Haskell do generowania deklaracji instancji w podobny sposób do klauzul pochodnych.
Poniższy przykład został bezwstydnie skradziony z Haskell Wiki :
źródło