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 Monadinstância Containerainda é interessante. (O fato de basedefinir a Monadinstância para Identityexplícito sugere que você não pode.)
Monadnã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.
GeneralizedNewtypeDerivingestá ativada e uma pergunta é por que ainda não funciona.
anã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.