Ich versuche, meinen eigenen Datentyp zu erstellen, der Teil der Monad-Klasse sein wird, aber
newtype Container a = Container a deriving Monad
gibt mir diesen Fehler:
* Can't make a derived instance of `Monad Container'
(even with cunning GeneralizedNewtypeDeriving):
cannot eta-reduce the representation type enough
* In the newtype declaration for `Container'
|
30 | newtype Container a = Container a deriving Monad
Es funktioniert gut für andere Klassen (z. B. Show), aber nicht für Monad. Wie kann ich ghci davon überzeugen, meine Container to Monad-Klasse zu instanziieren?
Vielen Dank
GenerlizedNewtypeDeriving
dient speziell zum "Anheben" der Instanzen des umschlossenen Typs auf den neuen Typ. Die Frage, wie (oder ob) man automatisch eine Monad
Instanz ableiten kann, Container
ist immer noch interessant. (Die Tatsache, dass base
die Monad
Instanz Identity
explizit definiert wird, deutet darauf hin, dass dies nicht möglich ist.)
Monad
gehört nicht zu den Typklassen, die der Haskell-Standard zur automatischen Ableitung bereitstellt ( Show
zusammen mit einigen anderen grundlegenden). GHC kann es allerdings mit den richtigen Erweiterungen tun, glaube ich.
GeneralizedNewtypeDeriving
, dass sie aktiviert ist, und eine Frage ist, warum sie immer noch nicht funktioniert.
a
es sich nicht um eine Monade handelt, daher macht es nicht viel Sinn. Wenn Sie zum Beispiel verwenden würden, wirdnewtype Container a = Container [a] deriving (Functor, Applicative, Monad)
es funktionieren, da[]
es sich um eine Instanz von handeltMonad
.