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

내가받을 다음과 같은 오류 내가 잘못 뭐하는 거지하스켈 주요 기능

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

?

답변

16

do 블록 내의 모든 함수는 반환되는 모나드 값과 일치해야합니다. printIO 값을 반환하기 때문에 대신

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

을 작성할 수 있습니다. 당신이 Maybe 모나드를 사용한다면 마찬가지로, 당신은 lookuplistToMaybe 모두 유형에 지정된대로 전체 do 블록의 반환 값을하는 Maybe을 반환하기 때문에 작동

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

같이해야 할 것이다 서명은 firstElementOf입니다.

유형을 보면 qsort이며 이 아닌 [a] 만 반환하므로 main 님의 블록에서 바로 사용할 수 없습니다. let을 사용하여 이름에 반환 된 값을 할당 할 수도 있습니다.

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

나는 do를 제거한 다음 동일한 오류가 발생합니다. main :: qsort [1,2,3] – weima

+2

@weima'main :: IO()'와'qsort :: Ord a => [a] -> [a]'를 사용한다면'main = qsort [1, 3, 2]', 왜냐하면'main'은'IO()'타입을 가지고 있고'[a]'타입을 가지고 있기 때문입니다. 만약 당신이'int x = 1; string y = x;', 대부분의 프로그래밍 언어는'string'과'int'가 같지 않기 때문에 타입 불일치로이를 거부합니다. 여기서 일어나는 일이 있는데,'main'은 하나의 타입이고 다른 타입의 값과 동일하게 설정하려고한다고했습니다. 'qsort'의 출력을'IO' 값으로 변환해야하고, 인쇄하기를 원하기 때문에'print' 함수가 이것을 할 수 있습니다. – bheklilr

+0

은 기본 고정 유형입니까? main = [Integer]를 정의하여 main = qsort [1,2,3]가 컴파일되도록 시도했지만 여전히 오류가 발생합니다. main이 있어야하고 IO 클래스 출력이 있어야합니다. – weima