Самодельный монадный трансформатор 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)