2014-10-20 22 views
6
module Main where 

qsort :: Ord a => [a] -> [a] 
qsort [] = [] 
qsort (x : xs) = qsort smaller ++ [x] ++ qsort larger 
       where 
        smaller = [a | a <- xs , a <= x] 
        larger = [a | a <- xs , a > x] 

main = do qsort [1,3,2] 

ottengo il seguente errorefunzione principale Haskell

Couldn't match expected type `IO t0' with actual type `[a0]'   
In the expression: main 
When checking the type of the function `main' 

Che cosa sto facendo di sbagliato?

risposta

16

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 
+0

ho rimosso il fai, poi anche ottengo lo stesso errore. main = qsort [1,2,3] – weima

+2

@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

+0

è 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