哈斯克尔:不能使用“地图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 ls
的map putStrLn ls
types是[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
。