2016-04-26 13 views
1

Wie man den Typ Showable machen kann?Machen Sie den Typ showable.

type InterpreterMonad = StateT (Env, Env) (ErrorT String IO)() 

Normalerweise würde ich deriving Show geben, aber ich habe ein type nicht newtype oder data.

P.S. Wie schreibe ich oben mit newtype?

+1

Mögliche Duplikate von [Wie wirken sich Synonyme auf Instanzen von Typklassen aus? Was macht das Pragma TypSynonymInstances in GHC?] (Http://stackoverflow.com/questions/2125674/what-is-the-effect-of-type-synonyms-on-instances-of-type-classes-what-does -the) – jberryman

+1

Wenn du 'StateT' ansiehst, ist es im Grunde eine Funktion und nun hast du das Problem, eine Funktion darstellbar zu machen - nimm' id :: a -> a' zum Beispiel - was soll 'id' drucken? – Carsten

Antwort

4

type erstellt einen Typ-Synonym. Wenn Sie eine Instanz erstellen möchten, müssen Sie sie für das Ziel vom Typ Synonym erstellen - in diesem Fall StateT (Env, Env) (ErrorT String IO)(). GHC kann jedoch keine Show Instanz für StateT Typen ableiten, da StateT ein Wrapper um einen Funktionstyp ist und GHC Show für Funktionstypen nicht ableiten kann.

Sie könnten einen newtype schreiben wie folgt:

newtype InterpreterMonad = MkInterpreterMonad (StateT (Env, Env) (ErrorT String IO)()) 

aber nicht zulassen, dass Sie Show entweder abzuleiten, da InterpreterMonad nun ein Wrapper um einen Wrapper um einen Funktionstyp ist.

Verwandte Themen