1

J'ai défini un transformateur de monade UlffT comme suit.« instances de synonymes de type ne sont pas autorisés », même si j'ai un transformateur monade newtype

Je travaille avec Halogen, mais ce n'est pas un Halogen -question - Je fournis juste le contexte. UlffT est destiné à être empilés sur Aff et utilisé HalogenM.

newtype UlffT m a = UlffT (ExceptT Error (ReaderT Env m) a) 

unUlffT :: forall m. UlffT m ~> ExceptT Error (ReaderT Env m) 
unUlffT (UlffT m) = m 

derive newtype instance functorUlffT :: Functor m => Functor (UlffT m) 
derive newtype instance applyUlffT :: Monad m => Apply (UlffT m) 
derive newtype instance applicativeUlffT :: Monad m => Applicative (UlffT m) 
derive newtype instance bindUlffT :: Monad m => Bind (UlffT m) 
derive newtype instance monadUlffT :: Monad m => Monad (UlffT m) 

instance monadTransUlffT 
     :: MonadTrans UlffT where 
    lift = UlffT <<< lift <<< lift 

instance monadEffUlffT 
     :: MonadEff eff m 
     => MonadEff eff (UlffT m) where 
    liftEff = lift <<< liftEff 

instance monadAffUlffT 
     :: MonadAff eff m 
     => MonadAff eff (UlffT m) where 
    liftAff = lift <<< liftAff 

Tout va bien ici. Maintenant, je définis l'instance évidente pour MonadAsk comme suit.

instance monadAskUlffT 
     :: MonadAsk Env (UlffT m) where 
    ask = UlffT $ lift ask 

Et je reçois l'erreur

Type class instances for type synonyms are disallowed. 

UlffT n'est pas synonyme de type. Je m'attendais à des erreurs concernant m, par ex. Je dois déclarer des contraintes comme Monad m => ..., ou Monad (UlffT m) => ....

je reçois la même erreur, lors du calcul de la MonadAsk -instance.

+1

Quel est le type 'Env' impliqué ici? Peut-être que c'est le synonyme? –

+0

Voilà la bonne réponse –

Répondre

1

Le commentaire de gb: bien sûr MonadAsk a deux params, le premier Env était le délinquant.