2017-01-24 19 views
3

我有以下newtype不能使單子轉換的派生實例

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 

newtype Wrap m a = Wrap {runWrap :: m a} 
    deriving (Functor, Applicative, Monad, MonadTrans) 

我試圖自動獲得MonadTrans,但我得到了以下錯誤:

• Can't make a derived instance of ‘MonadTrans Wrap’ 
    (even with cunning GeneralizedNewtypeDeriving): 
    cannot eta-reduce the representation type enough 
• In the newtype declaration for ‘Wrap’ 

然而,寫作MonadTrans的微不足道實例工作得很好:

instance MonadTrans Wrap where 
    lift = Wrap 

這種錯誤信息的原因是什麼?

回答

8

GeneralizedNewtypeDeriving使用類的基礎實例來實現newtype的類。然而,在這種情況下,這是沒有任何意義的,因爲m是不正確的種類甚至是MonadTrans(回憶m :: * -> *,但MonadTrans想要(* -> *) -> * -> *)的實例。

+0

在這種情況下,「一類的底層實例」是什麼意思? –

+0

有沒有一種方法來派生'MonadTrans'的微不足道的實例? –

+0

差不多一年後[看來我一直在打同一面牆](https://stackoverflow.com/questions/47579216/doing-dependency-injection-using-monad-stacks)。 –