我有一个字符串列表,并尝试了以下操作:

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'

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

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

谢谢!

有帮助吗?

解决方案

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

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

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

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

以下是如何使用它:

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

其他提示

艾曼的回答让这个局面最有意义。在一般情况下,如果你有[m ()],你想m (),然后用sequence_,其中m可以是包括IO任何单子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top