Tutte le funzioni all'interno di un blocco do
devono corrispondere al valore monadico restituito. Si potrebbe invece scrivere
main = do
print (qsort [1, 3, 2])
Perché print
restituisce un valore IO
. Allo stesso modo, se si sta utilizzando il Maybe
Monade, che avrebbe dovuto fare qualcosa di simile
-- lookup :: Eq k => k -> [(k, v)] -> Maybe v
-- listToMaybe :: [a] -> Maybe a
firstElementOf :: Eq q => k -> [(k, [v])] -> Maybe v
firstElementOf key assocMap = do
v <- lookup key assocMap
first <- listToMaybe v
return first
Questo funziona perché lookup
e listToMaybe
entrambi restituiscono un Maybe
, che è il valore di ritorno del blocco complessiva do
come specificato dal tipo di firma di firstElementOf
.
Guardando il tipo di qsort
, restituisce solo [a]
, non IO something
, quindi non può essere utilizzato direttamente all'interno main
's fanno blocco. Si potrebbe anche assegnare è restituito il valore di un nome utilizzando let
:
main = do
let result = qsort [1, 3, 2]
print result
ho rimosso il fai, poi anche ottengo lo stesso errore. main = qsort [1,2,3] – weima
@weima Se hai 'main :: IO()' e 'qsort :: Ord a => [a] -> [a]', non puoi dire 'main = qsort [1, 3, 2] ', perché diresti che' main' ha tipo 'IO()' e ha tipo '[a]'. Sarebbe come se tu avessi 'int x = 1; string y = x; ', la maggior parte dei linguaggi di programmazione rigetterebbe questo come mancata corrispondenza di tipo perché' stringa' e 'int' non sono gli stessi. Questo è ciò che sta accadendo qui, hai detto che 'main' è un tipo e poi provi a impostarlo su un valore di un altro tipo. Devi convertire l'output di 'qsort' in un valore' IO', e dato che vuoi stamparlo, la funzione 'print' può farlo. – bheklilr
è il tipo di fisso principale? Ho provato a definire main :: [Integer] in modo che main = qsort [1,2,3] si compili, ma continua a errare. sembra principale deve avere e output di classe IO – weima