Estou tentando criar meu próprio tipo de dados, que fará parte da classe Monad, mas
newtype Container a = Container a deriving Monad
me dá este erro:
* 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 bem para outras classes (Show, por exemplo), mas não para o Monad, então como convencer o ghci a instanciar minha classe Container to Monad?
obrigado
GenerlizedNewtypeDeriving
é especificamente para "elevar" as instâncias do tipo agrupado para o novo tipo. A questão de como (ou se) alguém pode derivar automaticamente uma Monad
instância Container
ainda é interessante. (O fato de base
definir a Monad
instância para Identity
explícito sugere que você não pode.)
Monad
não é uma das classes de tipo que o padrão Haskell disponibiliza para ser derivada automaticamente ( Show
é, juntamente com algumas outras básicas). O GHC pode fazer isso com as extensões corretas, acredito.
GeneralizedNewtypeDeriving
está ativada e uma pergunta é por que ainda não funciona.
a
não é um exemplo de mônada, portanto, não faz muito sentido. Se você, por exemplo, usassenewtype Container a = Container [a] deriving (Functor, Applicative, Monad)
, funcionará, já que[]
é uma instância deMonad
.