9

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

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

4

1 回答 1

15

您需要映射列表,但由于这些是 IO 操作,您还需要执行它们(因为map将返回 IO 操作列表而不执行它们,请参见以下示例)。

sequence $ map (putStrLn . show) [1,2,3,4]

已经有一个函数可以做到这一点,它是mapM. 所以这个例子可以简化为:

mapM (putStrLn . show) [1,2,3,4]

您可以做的另一件事是使用mapM_which usessequence_代替,并将忽略对每个元素执行 IO 操作的结果。因此,返回类型将是IO ()代替IO [()](上一个示例)。

mapM_ (putStrLn . show) [1,2,3,4]
于 2013-03-16T14:41:51.463 回答