2012-01-16 45 views
0

在此代碼中存在錯誤起因以致不匹配。由於類型不匹配導致的代碼中的錯誤

import System.IO 
    loop :: Int -> [Int] -> IO() 
    loop 0 ls = return ls 
    loop n ls = do newNumber <- readLn 
      loop (n-1) (newNumber:ls) 


    main = do 
    putStrLn "Please enter the number" 
    number <- readLn :: IO Int 
    putStrLn $ "The num is:" ++ show number 
    xs <- loop number [] 
    print xs 

的錯誤信息是:

treep.hs:4:20: 
Couldn't match expected type `()' with actual type `[Int]' 
In the first argument of `return', namely `ls' 
In the expression: return ls 
In an equation for `loop': loop 0 ls = return ls 

如何刪除錯誤

+0

@tikhon請看這段代碼 – 2012-01-16 08:55:55

+0

你想用'循環'功能完成什麼?它的簽名表示它需要一個整數('Int')整數列表('[Int]')並返回一個操作。 – Andre 2012-01-16 09:10:48

+0

我想讓循環運行n次,並最終返回n個數字列表 – 2012-01-16 09:13:00

回答

2

從您的意見,您的loop函數應返回IO [Int],就像這樣:

loop :: Int -> IO [Int] 

那麼第一種情況是:

loop 0 = return [] 

第二個應該與您所寫的相似(不通過ls這是您的結果,而不是輸入)。

BTW,誤差可以這樣解釋的:

loop :: Int -> [Int] -> IO()  -- line 1 
loop 0 ls = return ls    -- line 2 

在第1行,你告訴了loop函數有兩個參數,一個Int[Int]編譯器。在第2行中,您使用0(這是一個Int,因此很好)和ls。所以,ls的類型是[Int]return的簽名是return :: a -> m a,返回類型取決於Monad m(在您的情況下爲IO)和輸入類型爲[Int]。因此,return ls的類型是IO [Int],但是您在第1行告訴編譯器它應該是`IO()'。 (究竟是什麼編譯器告訴你該錯誤消息。;-))

2

ls具有類型[Int],所以return ls具有類型IO [Int]。但是,您的類型簽名表示該函數應該返回IO()。它看起來像你只是錯誤的類型簽名。這應該工作:

loop :: Int -> [Int] -> IO [Int] 
相關問題