Haskell: получение типов Show для Fix

Я пытаюсь реализовать рекурсивный тип данных, используя recursion-schemes. Я хотел бы иметь возможность распечатать его.

import Data.Functor.Foldable

data T1F a = Foo deriving Show
type T1 = Fix T1F
data T2 = Bar T1 deriving Show -- error here

Сообщение об ошибке:

No instance for (Data.Functor.Classes.Show1 T1F)
  arising from the first field of ‘Bar’ (type ‘T1’)
Possible fix:
  use a standalone 'deriving instance' declaration,
    so you can specify the instance context yourself
When deriving the instance for (Show T2)

Как сделать T1 производным Show?


person Carl Patenaude Poulin    schedule 21.03.2017    source источник
comment
Сообщение об ошибке сообщает вам о проблеме. Вам нужен экземпляр Show1 для T1F. Написание экземпляров Show1 вручную может быть довольно утомительным. К счастью, пакет deriving-compat поддержит вас.   -  person Benjamin Hodgson♦    schedule 21.03.2017
comment
@BenjaminHodgson, есть ли пример ручного вывода?   -  person CMCDragonkai    schedule 26.05.2018
comment
@CMCDragonkai Самый простой способ - получить Show для вашего типа данных, просмотреть сгенерированный код путем компиляции с -ddump-deriv, а затем вставить и адаптировать его. Однако задача не из приятных — гораздо проще использовать помощников TH в пакете!   -  person Benjamin Hodgson♦    schedule 27.05.2018
comment
Понимаю. Я до сих пор не понимаю, зачем это нужно.   -  person CMCDragonkai    schedule 27.05.2018


Ответы (1)


Используя пакет deriving-compat:

{-# LANGUAGE TemplateHaskell #-}
import Data.Functor.Foldable
import Text.Show.Deriving

data T1F a = Foo deriving Show
$(deriveShow1 ''T1F)
type T1 = Fix T1F
data T2 = Bar T1 deriving Show
person Carl Patenaude Poulin    schedule 21.03.2017