1
다음과 같이 모나드 변환기 UlffT
을 정의했습니다.newtype 모나드 변환기가 있어도 "동의어 인스턴스가 허용되지 않습니다"
저는 Halogen
과 협력하고 있습니다. 그러나 이것은 Halogen
이 아닙니다. 질문 - 문맥을 제공하고 있습니다. UlffT
은 Aff
에 쌓아 올려지고 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를 파생하면 동일한 오류가 발생합니다.
여기에 포함 된'Env' 유형은 무엇입니까? 아마 그게 동의어일까요? –
그게 옳은 대답입니다. –