Estoy tratando de crear mi propio tipo de datos, que formará parte de la clase Monad, pero
newtype Container a = Container a deriving Monad
me da este error:
* 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
Funciona bien para otras clases (Mostrar, por ejemplo), pero no para Monad, entonces, ¿cómo puedo convencer a ghci de que instale mi clase Container to Monad?
Gracias
GenerlizedNewtypeDerivinges específicamente para "levantar" las instancias del tipo envuelto al nuevo tipo. La pregunta de cómo (o si) uno puede derivar automáticamente una Monadinstancia para Containertodavía es interesante. (El hecho que basedefine la Monadinstancia para Identityexplícito sugiere que no puede)
Monadno es una de las clases de tipos que el estándar Haskell pone a disposición para ser derivadas automáticamente ( Showes, junto con algunas otras básicas). Sin embargo, creo que GHC puede hacerlo con las extensiones correctas.
GeneralizedNewtypeDerivingestá habilitado, y una pregunta es por qué todavía no funciona.
ano es una instancia de mónada, por lo tanto, no tiene mucho sentido. Si, por ejemplo, lo usanewtype Container a = Container [a] deriving (Functor, Applicative, Monad), funcionará, ya que[]es una instancia deMonad.