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

tôi nhận được lỗi sauchức năng chính Haskell

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

Tôi đang làm gì sai?

Trả lời

16

Tất cả các chức năng trong khối do phải khớp với giá trị đơn nguyên được trả lại. Thay vào đó, bạn có thể viết

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

print trả về giá trị IO. Tương tự như vậy, nếu bạn đang sử dụng Maybe đơn nguyên, bạn sẽ phải làm một cái gì đó giống như

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

này hoạt động vì lookuplistToMaybe cả trả về một Maybe, đó là giá trị trả về của do khối tổng thể theo quy định của các loại chữ ký của firstElementOf.

Nhìn vào loại qsort, nó chỉ trả về [a], không phải IO something, do đó không thể sử dụng trực tiếp trong khối của main. Bạn cũng có thể gán giá trị trả lại cho một tên bằng cách sử dụng let:

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

tôi đã xóa lỗi, sau đó tôi cũng gặp lỗi tương tự. main = qsort [1,2,3] – weima

+2

@weima Nếu bạn có 'main :: IO()' và 'qsort :: Ord a => [a] -> [a]', bạn không thể nói 'chính = qsort [1, 3, 2] ', bởi vì bạn muốn nói rằng' main' có kiểu 'IO()' và nó có kiểu '[a]'. Nó sẽ giống như nếu bạn có 'int x = 1; string y = x; ', hầu hết các ngôn ngữ lập trình sẽ từ chối điều này như một kiểu không khớp vì' string' và 'int' không giống nhau. Đó là những gì đang xảy ra ở đây, bạn đã nói 'main' là một loại và sau đó bạn cố gắng thiết lập nó bằng một giá trị của một kiểu khác. Bạn phải chuyển đổi đầu ra của 'qsort' thành một giá trị' IO', và vì bạn muốn in nó, hàm 'print' có thể làm điều này. – bheklilr

+0

là loại cố định chính? tôi đã cố gắng để xác định chính :: [Integer] để chính = qsort [1,2,3] sẽ biên dịch, nhưng nó vẫn erros ra. có vẻ chính phải có và IO lớp đầu ra – weima