GHC kann Instanzen für beliebige Datentypen nicht magisch ableiten. Jedoch kann die Tatsache nutzen, dass newtype
Deklarationen einen neuen Namen für den gleichen zugrunde liegenden Typ erstellen, um Instanzen für diejenigen ableiten, die die GeneralizedNewtypeDeriving
Erweiterung verwenden. So konnten Sie so etwas tun:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
Der Grund GHC nicht die neue Instanz ableiten kann, ist, dass sie nicht weiß, was die Instanz sein sollte. Auch wenn Ihr Datentyp nur ein Feld enthält, ist es möglicherweise nicht unbedingt das selbe wie das Feld. Die Möglichkeit, Instanzen für newtype
s abzuleiten, ist praktisch, da sie normalerweise verwenden, um unterschiedliche Verhaltensweisen für bestimmte Klassen bereitzustellen oder das Typsystem zu verwenden, um Dinge zu trennen, die denselben Typ, aber unterschiedliche Verwendungen in Ihrem Code haben.
Sie brauchen nicht den 'MyClass a =>' Teil der Typ-Signatur für 'Hallo'; es wird dadurch impliziert, dass "a" über eine Klassendeklaration der Form "class MyClass a where ..." in den Geltungsbereich gebracht wird. –
Werfen Sie einen Blick auf den [GHC-Benutzerleitfaden zum Ableiten] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extensions-to-the-deriving-mechanism). –