由于类型不匹配导致代码出错

时间:2012-01-16 08:54:47

标签: haskell

在此代码中,由于不匹配而出现错误。

   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

如何删除错误

2 个答案:

答案 0 :(得分:2)

从您的评论中,您的loop函数应返回IO [Int],如下所示:

loop :: Int -> IO [Int]

然后第一个案例是:

loop 0 = return []

第二个应该与你写的相似(不传递ls这是你的结果,而不是输入)。

顺便说一下,错误可以用这种方式解释:

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()'。 (正是编译器通过错误消息告诉你的。;-))

答案 1 :(得分:2)

ls的类型为[Int],因此return ls的类型为IO [Int]。但是,您的类型签名表示该函数应返回IO ()。看起来你只是错误地输入了类型签名。这应该有效:

loop :: Int -> [Int] -> IO [Int]