2014-09-21 12 views
7

Podążyłem za książką, aby zdefiniować typ danych Drzewa, ale show nie działa poprawnie. Czemu?Dlaczego Haskell nie może wnioskować o typie drzewa?

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

test = show EmptyTree 

daje komunikat o błędzie:

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

Jak masz uruchomiony ten kod? Czy używasz tłumacza (ghci)? Ta linia: 'test = show EmptyTree' jest nieprawidłową składnią Haskell, więc prawdopodobnie nie wklejasz całego kodu. – rburny

+2

@rburny Myślę, że OP ma to w pliku źródłowym. – Sibi

+0

Używam Eclipse –

Odpowiedz

15

Problemem jest to, że EmptyTree ma typ Tree a dla dowolny typ a. Nawet jeśli nie wpłynie to na ostateczne wyjście, kompilator chce wiedzieć, co masz na myśli.

Najprostszym rozwiązaniem jest wybranie określonego typu, np. z show (EmptyTree :: Tree()). Ten wykorzystuje jednostkową typ (), który jest w pewnym sensie najprostszy typ, ale można też użyć innego rodzaju, który ma wystąpienie Show, jak Int, String itp

+0

+1, "()" jest drogą do zrobienia. :) – Sibi

+0

Dzięki @Ganesh Sittampalam. To działa. –

Powiązane problemy