2014-10-20 15 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] 

otrzymuję następujący błądHaskell Główną funkcją

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

Co robię źle?

Odpowiedz

16

Wszystkie funkcje w obrębie bloku do muszą być zgodne z zwracaną wartością monadyczną. Można zamiast pisać

main = do 
    print (qsort [1, 3, 2]) 

Ponieważ print zwraca wartość IO. Podobnie, jeśli były przy użyciu Maybe monady, trzeba by zrobić coś takiego

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

To działa, ponieważ lookup i listToMaybe zarówno zwrócić Maybe, która jest wartością zwracaną ogólnej bloku do sposób określony przez typ podpis firstElementOf.

Patrząc na rodzaj qsort, tylko zwraca [a], nie IO something, więc nie może być stosowany bezpośrednio wewnątrz main „s zrobić blok. Można również przypisać wartość to wrócił do nazwy używając let:

main = do 
    let result = qsort [1, 3, 2] 
    print result 
+0

usunąłem tak, to też mi się ten sam błąd. main = qsort [1,2,3] – weima

+2

@weima Jeśli masz 'main :: IO()' i 'qsort :: Ord a => [a] -> [a]', nie możesz powiedzieć 'main = qsort [1, 3, 2] ', ponieważ mówiłeś, że' main' ma typ 'IO()' i ma typ '[a]'. Byłoby tak, jakbyś miał int x = 1; ciąg y = x; ', większość języków programowania odrzuciłoby to jako niedopasowanie typu, ponieważ' string' i 'int' nie są takie same. Tak właśnie się dzieje, powiedziałeś "main" jest jednym typem, a następnie próbujesz ustawić go na wartość innego typu. Musisz przekonwertować wyjście 'qsort' do wartości' IO', a ponieważ chcesz ją wydrukować, funkcja 'print' może to zrobić. – bheklilr

+0

to typ głównej stałej? Próbowałem zdefiniować main :: [Integer] tak, aby main = qsort [1,2,3] się skompilował, ale nadal kasuje. Wydaje się, że główne musi mieć i wyjścia klasy IO – weima

Powiązane problemy