Самодельный преобразователь монад на 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?


person Marco Faustinelli    schedule 02.06.2015    source источник


Ответы (1)


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

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
person user2407038    schedule 02.06.2015
comment
Спасибо. Идеально. Почему в этом случае нет отступа у выводной строки? Я бы сказал, что это относится к объявлению нового типа. Разве это не так? - person Marco Faustinelli; 03.06.2015
comment
Нет - автономное получение вводит новый синтаксис, deriving instance <class>, который даже не должен находиться в том же модуле, что и тип данных. Две строки являются независимыми объявлениями. - person user2407038; 03.06.2015