我正在尝试以这种格式打印出整数列表
[1]
[2]
[3]
所以我的函数获取一个整数列表并返回一个IO(),如下所示:
import System.IO
printVector :: [Integer] -> IO ()
printVector (x:xs) = putStr("[" ++ show(x) ++ "]" ++ "\n") : printVector xs
但是ghc给了我错误:
lin-test.hs:5:22:
Couldn't match expected type `IO ()' with actual type `[a0]'
In the expression:
putStr ("[" ++ show (x) ++ "]" ++ "") : printVector xs
In an equation for `printVector':
printVector (x : xs)
= putStr ("[" ++ show (x) ++ "]" ++ "") : printVector xs
Failed, modules loaded: none.
现在我的理解是该函数将遍历列表,首先是第一个项'x',然后是:printVector xs它将递归调用列表的其余部分,将相同的putStr函数应用于每个项目清单。
但我觉得我的问题出在我的位置:printVector xs? 谁能指出我在这里做错了什么?
答案 0 :(得分:14)
您需要映射列表,但由于这些是IO操作,您还需要执行它们(因为map
将返回IO操作列表而不执行它们,请参阅下面的示例)。
sequence $ map (putStrLn . show) [1,2,3,4]
有一个函数已经这样做了,它是mapM
。所以这个例子可以简化为:
mapM (putStrLn . show) [1,2,3,4]
您可以做的另一件事是使用mapM_
代替sequence_
而忽略对每个元素执行IO操作的结果。因此,返回类型将为IO ()
而不是IO [()]
(前一个示例)。
mapM_ (putStrLn . show) [1,2,3,4]