将putStr应用于列表的每个项目

时间:2013-03-16 14:29:54

标签: list haskell printing

我正在尝试以这种格式打印出整数列表

[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? 谁能指出我在这里做错了什么?

1 个答案:

答案 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]