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
a
no 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
.GenerlizedNewtypeDeriving
es específicamente para "levantar" las instancias del tipo envuelto al nuevo tipo. La pregunta de cómo (o si) uno puede derivar automáticamente unaMonad
instancia paraContainer
todavía es interesante. (El hecho quebase
define laMonad
instancia paraIdentity
explícito sugiere que no puede)Monad
no es una de las clases de tipos que el estándar Haskell pone a disposición para ser derivadas automáticamente (Show
es, junto con algunas otras básicas). Sin embargo, creo que GHC puede hacerlo con las extensiones correctas.GeneralizedNewtypeDeriving
está habilitado, y una pregunta es por qué todavía no funciona.