Самодельный монадный трансформатор Haskell не может проявить себя в GHCi

Я балуюсь простыми монадными трансформаторами, как представлено в http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf

Мой обработчик ошибок имеет тип

newtype ET m a = ET (m (Maybe a))

Я реализовал всю необходимую сантехнику и смог соединить ее с монадой идентификации (которая в моей маленькой песочнице называется I) и писать / компилировать нетривиальные функции.

Но я не могу напечатать любое результирующее значение на экране. Сообщение:

No instance for (Show (ET I Value)) arising from a use of ‘print’

Maybe импортируется. И то и другое I а также Value выводить Show и отображать самостоятельно без проблем. Это смесь с ET это не покажет. Я вижу два пути:

  • попробуй вставить deriving Show в декларации ET m a (который я пытался разными способами получить много разных сообщений об ошибках)
  • создайте демонстрационный экземпляр с "автономными производными объявлениями", как предлагали некоторые веб-ресурсы, - пока безуспешно.

Как я могу показать ET I Value в моем REPL?

1 ответ

Решение

Одна из целей автономного извлечения состоит в том, что иногда компилятор не может вывести требуемое ограничение для создания определенного экземпляра, даже если фактический код все еще получается механически. Так что вам просто нужно знать, какое ограничение дать ему:

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
Другие вопросы по тегам