在此代码中,由于不匹配而出现错误。
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 :(得分: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]