Невозможно создать производный экземпляр монадного преобразователя

У меня есть следующее 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

В чем причина такого сообщения об ошибке?


person Damian Nadales    schedule 24.01.2017    source источник


Ответы (1)


GeneralizedNewtypeDeriving использует базовый экземпляр класса для реализации класса newtype. Однако в данном случае это не имеет никакого смысла, потому что m не подходит даже для того, чтобы быть экземпляром MonadTrans (напомним, что m :: * -> *, но MonadTrans хочет (* -> *) -> * -> *).

person ocharles    schedule 24.01.2017
comment
Что вы подразумеваете под базовым экземпляром класса в этом контексте? - person Damian Nadales; 24.01.2017
comment
Есть ли способ получить тривиальные экземпляры для MonadTrans? - person Damian Nadales; 24.01.2017
comment
Почти год спустя кажется, я продолжаю натыкаться на ту же стену. - person Damian Nadales; 30.11.2017