题
我有一个字符串列表,并尝试了以下操作:
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
任何单子。
不隶属于 StackOverflow