哈斯克尔:不能使用“地图putStrLn”?

我有一个string列表,并试过这个:

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' 

任何提示? 我想这与地图返回一个列表,而不是一个值,但我没有find一个简单的方法来解决这个问题。

现在我知道打印string列表的唯一方法是编写一个迭代列表的函数,打印每个元素(如果列表是[a],则打印,但如果是(a:b)则打印并recursion)。 但是使用map会简单多了

谢谢!

main函数的types应该是IO t (其中t是一个typesvariables)。 map putStrLn lsmap putStrLn lstypes是[IO ()] 。 这就是为什么你得到这个错误信息。 你可以通过在ghci运行以下来validation它:

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

解决这个问题的一个办法是使用mapM ,它是mapM版本。 或者,您可以使用mapM_ ,它与mapM相同,但不会从函数中收集返回的值。 既然你不关心putStrLn的返回值,在这里使用mapM_更合适。 mapM_具有以下types:

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

以下是如何使用它:

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

艾曼的回答对于这种情况是最有意义的。 一般来说,如果你有[m ()]并且你想要m () ,那么使用sequence_ ,其中m可以是任何monad,包括IO