gpt4 book ai didi

Haskell:无法使用 "map putStrLn"?

转载 作者:行者123 更新时间:2023-12-03 05:51:20 24 4
gpt4 key购买 nike

我有一个字符串列表,并尝试了这个:

ls = [ "banana", "mango", "orange" ]

main = do
map PutStrLn list_of_strings

这不起作用,我不明白为什么。

ghc print-list.hs
print-list.hs:3:0:
Couldn't match expected type `IO t' against inferred type `[IO ()]'
In the expression: main
When checking the type of the function `main'

有什么提示吗?我想这与 map 返回列表而不是值有关,但我没有找到解决此问题的简单方法。

现在我知道打印字符串列表的唯一方法是编写一个函数来迭代列表,打印每个元素(如果列表是 [a] 则打印,但如果是 (a:b 则打印并递归))。但仅使用 map 会简单得多...

谢谢!

最佳答案

main 函数的类型应为 IO t(其中 t 是类型变量)。 map putStrLn ls 的类型为[IO ()]。这就是您收到此错误消息的原因。您可以通过在 ghci 中运行以下命令自行验证:

Prelude> :type map putStrLn ls
map putStrLn ls :: [IO ()]

该问题的一种解决方案是使用 mapM ,这是 map 的“monadic”版本。或者您可以使用mapM_它与mapM相同,但不收集函数的返回值。由于您不关心 putStrLn 的返回值,因此这里使用 mapM_ 更合适。 mapM_ 具有以下类型:

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

使用方法如下:

ls = [ "banana", "mango", "orange" ]
main = mapM_ putStrLn ls

关于Haskell:无法使用 "map putStrLn"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932639/

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