1

私はモナド変換器UlffTを次のように定義しました。私はnewtypeモナド変換器を持っていても "型同義語インスタンスは許可されていません"

私はHalogenで働いているが、これはHalogen -questionではありません - 私はちょうどコンテキストを提供しています。 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を導出するときに同じエラーが発生します。

+1

ここに含まれる 'Env'タイプは何ですか?おそらくそれは同義語ですか? –

+0

これは正しい答えです –

答えて

1

gbのコメント:もちろんMonadAskには2つのパラメータがあり、最初の1つはEnvです。

関連する問題