Haskell: deriving Show for Fix types
Asked Answered
H

1

6

I'm trying to implement a recursive datatype using recursion-schemes. I would like to be able to print it.

import Data.Functor.Foldable

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

Error message:

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)

How do I make T1 derive Show?

Hysteric answered 21/3, 2017 at 18:36 Comment(4)
The error message tells you the problem. You need an instance of Show1 for T1F. Writing instances of Show1 by hand can be quite tedious. Fortunately the deriving-compat package has got your back.Spotted
@BenjaminHodgson is there an example of deriving it manually?Moradabad
@Moradabad Easiest way is to derive Show for your datatype, look at the generated code by compiling with -ddump-deriv, and then paste and adapt it. Not a fun task, though - much easier to use the TH helpers in the pkg!Spotted
I see. I still don't understand why this is needed.Moradabad
H
4

Using the package 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
Hysteric answered 21/3, 2017 at 19:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.