1

我已经定义了一个单子变压器UlffT如下。“类型同义词实例是不允许的”,即使我有一个新类型单子变压器

我正在与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有两个参数,第一个是Env是罪犯。

相关问题