Ho iniziato a sperimentare con Haskell e ho un problema. qqq è una funzione che dovrebbe stampare una stringa se chiamata con "Nothing" e stampare altre cose se chiamate con "Just something".Uso di "Forse" di Haskell, tipo dichiarazioni [domanda per principianti]
Il primo tentativo sembra di lavoro:
qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x
main :: IO()
main = qqq (Just 43)
Ma:
- quando provo a fare
main = qqq (Nothing)
non riesce ("tipo ambiguo variabile` a0' nel vincolo: (Visualizza a0) derivante da un uso di 'qqq' ") - Quando voglio aggiungere tipo di firma se fallisce:
-
qqq :: Maybe x => x -> IO()
->Type constructor 'Maybe' used as a class
-> Ma non è vero?
-
qqq :: (Maybe x) -> IO()
. Ora la firma stessa sembra avere successo. Mamain = qqq (Just 43)
inizia fallendo con quel misterioso errore(Show a0)
come nel casomain = qqq (Nothing)
.
Domande:
- Perché chiamare qqq con
Nothing
è così diverso che chiamare conJust 43
? - Che cos'è
(Show a0)
? Viene menzionato solo nei messaggi di errore. Qualsiasi tentativo di usarlo porta a qualcosa come "Mostra non nell'ambito". - Qual è la firma del tipo corretto per questo? Come si deduce la firma del tipo di stampa Haskell? In attesa di qualcosa di simile a:
f 0 = 2
f x = (f (x-1)) + 3
main = print get_type_as_string(f)
-- prints "Number -> Number"
risposto anche alla domanda non ha chiesto: "Perché non riesco ad impostare nulla in ghci, si lamenta' errore di analisi su '=' '" –
Is "tipo ambiguo" sempre un rifiuto in Haskell o può decidere "il tipo conta qui, quindi lascia che sia ambiguo "a volte? –
Haskell si lamenta di tipi ambigui quando il compilatore non sa cosa fare. Quindi, se il compilatore può scoprire quale sarà il tipo, non ci sono problemi, ma se il tipo deve essere dedotto senza sufficienti informazioni su di esso si ottiene l'errore. – Antti