data NestedList a = Elem a | List [NestedList a]
flatten :: NestedList a -> [a]
flatten (Elem element) = [element]
flatten (List []) = []
flatten (List (first:rest)) = flatten first ++ flatten (List (rest))
main = print $ flatten $ List []
Ho scritto il codice sopra visto in haskell. Quando eseguo questo con qualsiasi altro parametro, ad esempioNessuna istanza per (Mostra a0) derivante da un uso di `stampa 'La variabile di tipo` a0' è ambigua
main = print $ flatten $ List [Elem 1, Elem 2]
main = print $ flatten $ Elem 1
Dà
[1, 2]
[1]
rispettivamente.
Non riesce quando lo eseguo con una lista vuota.
main = print $ flatten $ List []
Messaggio di errore
No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Show Double -- Defined in `GHC.Float'
instance Show Float -- Defined in `GHC.Float'
instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
...plus 23 others
In the expression: print
In the expression: print $ flatten $ List []
In an equation for `main': main = print $ flatten $ List []
Domande
- Perché fallire e come posso risolvere questo problema?
- Devo modificare la definizione
NestedList
per accettare un numero vuotoList
? Se è così, come faccio a farlo. È abbastanza confuso.
GHC non ha informazioni quale tipo da utilizzare. Quando hai 'Elem 1', nella lista, hai fornito un vincolo' Num a', e quindi GHC ha potuto impostare la variabile type su 'Integer'. Senza elementi, non può default la variabile di tipo 'a0'. Dagli una firma tipo, 'main = print $ flatten $ (List [] :: NestedList())', ad esempio, in modo che il compilatore sappia quale tipo usare. –
Perché il downvote? – thefourtheye