2017-03-21 4 views
2

Ich versuche, einen rekursiven Datentyp mit zu implementieren. Ich würde gerne in der Lage sein, es zu drucken.Haskell: Ableiten zeigen für Fix-Typen

import Data.Functor.Foldable 

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

Fehlermeldung:

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) 

Wie kann ich machen T1Show ableiten?

+6

Die Fehlermeldung sagt Ihnen, das Problem. Sie benötigen eine Instanz von ['Show1'] (https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Functor-Classes.html#t:Show1) für' T1F'. Instanzen von 'Show1' von Hand zu schreiben kann ziemlich mühsam sein. Glücklicherweise hat das ['deriving-compat] (https://hackage.haskell.org/package/deriving-compat) -Paket [hat dir den Rücken frei] (https://hackage.haskell.org/package/deriving-compat- 0.3.5/docs/Text-Zeigen-Ableiten.html # v: ablseShow1). –

Antwort

2

das Paket mit 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