2014-09-21 12 views
7

Ich folgte dem Buch, um den Baumdatentyp zu definieren, aber show funktioniert nicht richtig. Warum?Warum kann Haskell nicht den Baumtyp ableiten?

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show) 

test = show EmptyTree 

gibt die Fehlermeldung:

No instance for (Show a0) arising from a use of ???show??? 
The type variable ???a0??? is ambiguous 
Note: there are several potential instances: 
    instance Show a => Show (Tree a) 
    -- Defined at /Users/gzhao/Documents/workspace/hsTest2/src/Tree.hs:3:62 
    instance Show Double -- Defined in ???GHC.Float??? 
    instance Show Float -- Defined in ???GHC.Float??? 
    ...plus 25 others 
In the expression: show EmptyTree 
In an equation for ???test???: test = show EmptyTree 
+0

Wie werden Sie diesen Code ausgeführt wird? Verwenden Sie einen Interpreter (ghci)? Diese Zeile: 'test = show EmptyTree' ist keine gültige Haskell-Syntax, also fügen Sie wahrscheinlich nicht Ihren gesamten Code ein. – rburny

+2

@rburny Ich denke, das OP hat das in der Quelldatei. – Sibi

+0

Ich benutze Eclipse –

Antwort

15

Das Problem ist, dass EmptyTreeaTree a für jede Typ Typ hat. Obwohl es die endgültige Ausgabe nicht wirklich beeinflusst, möchte der Compiler wissen, welche a Sie meinen.

Die einfachste Lösung ist die Auswahl eines bestimmten Typs, z. mit show (EmptyTree :: Tree()). Dies verwendet die Einheit Typ (), die eine möglichst einfache Art in einem gewissen Sinn ist, aber man kann auch jede andere Art verwenden, die eine Show Instanz hat, wie Int, String usw.

+0

+1, '()' ist der Weg zu gehen. :) – Sibi

+0

Danke @Ganesh Sittampalam. Es klappt. –

Verwandte Themen