1

Ich habe einen Monade-Transformator UlffT wie folgt definiert."Typ Synonym-Instanzen sind nicht erlaubt", obwohl ich eine neue Art Monade-Transformer haben

Ich arbeite mit Halogen, aber das ist keine Halogen-Frage - Ich biete nur Kontext. UlffT soll auf Aff gestapelt und in HalogenM verwendet werden.

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 

Bis hier ist alles in Ordnung. Jetzt definiere ich den offensichtlichen Fall für MonadAsk wie folgt.

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

und ich erhalte die Fehler

Type class instances for type synonyms are disallowed. 

UlffT kein Typ Synonym ist. Ich erwartete Fehler bezüglich m, z.B. Ich muss Einschränkungen wie Monad m => ... oder Monad (UlffT m) => ... deklarieren.

Ich bekomme den gleichen Fehler, wenn Sie die MonadAsk -Instanz ableiten.

+1

Was ist der Typ "Env"? Vielleicht ist das das Synonym? –

+0

Das ist die richtige Antwort –

Antwort

1

Kommentar von gb: natürlich MonadAsk hat zwei params, der erste Env war der Täter.

Verwandte Themen