gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:53:32 24 4
gpt4 key购买 nike

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

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

最佳答案

您需要映射列表,但由于这些是 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]

关于list - 将 putStr 应用于列表的每个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com