1

다음과 같이 모나드 변환기 UlffT을 정의했습니다.newtype 모나드 변환기가 있어도 "동의어 인스턴스가 허용되지 않습니다"

저는 Halogen과 협력하고 있습니다. 그러나 이것은 Halogen이 아닙니다. 질문 - 문맥을 제공하고 있습니다. UlffTAff에 쌓아 올려지고 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 

여기까지는 문제가 없습니다. 이제 MonadAsk에 대한 명백한 인스턴스를 다음과 같이 정의합니다.

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

은 내가

Type class instances for type synonyms are disallowed. 

UlffT이 유형의 동의어없는 오류를 얻을. m과 관련된 오류가 예상됩니다. Monad m => ... 또는 Monad (UlffT m) => ...과 같은 제약 조건을 선언해야합니다.

MonadAsk -instance를 파생하면 동일한 오류가 발생합니다.

+1

여기에 포함 된'Env' 유형은 무엇입니까? 아마 그게 동의어일까요? –

+0

그게 옳은 대답입니다. –

답변

1

gb의 코멘트 : 물론 MonadAsk에는 두 개의 매개 변수가 있으며 첫 번째 것은 Env입니다.