简单的问题,但我似乎无法弄明白。我有一个列表,我想在它自己的行上打印出它的每个元素。我能做到
map show [1..10]
例如,将一起打印出来,但没有换行符。我的想法是map (putStrLn $ show) [1..10]
,但这不起作用,因为我刚回来[IO()]
。有什么想法吗?
答案 0 :(得分:9)
这些答案是否过分强调IO?如果你想穿插换行符,标准的Prelude公式是:
> unlines (map show [1..10])
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
这是你要写的东西 - 毕竟换行符是字符而非行动。获得表达式后,您可以直接应用putStrLn
或writeFile "Numbers.txt"
。所以你想要的完整操作就像这样的构成:
putStrLn . unlines . map show
在ghci
你有
> (putStrLn . unlines . map show) [1,2,3]
1
2
3
答案 1 :(得分:6)
试试这个:mapM_ (putStrLn . show) [1..10]
答案 2 :(得分:6)
这是我个人最喜欢的名为sequence的monad命令:
sequence :: Monad m => [m a] -> m [a]
因此你可以完全尝试:
sequence_ . map (putStrLn . show) $ [1..10]
哪个更罗嗦,但它导致我发现非常好的功能(虽然与你的问题无关):
sequence_ . intersperse (putStrLn "")
这可能是一种丑陋的方式,但我认为这很酷。