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
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 una Monad
instancia para Container
todavía es interesante. (El hecho que base
define la Monad
instancia para Identity
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.
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
.