简单的问题,但我似乎无法弄明白.我有一个列表,我想在它自己的行上打印出它的每个元素.我可以
map show [1..10]
Run Code Online (Sandbox Code Playgroud)
例如,它将一起打印出来,但没有换行符.我的想法是这样做,map (putStrLn $ show) [1..10]但这不起作用,因为我只是回来了[IO()].有什么想法吗?
这些答案不是过分强调IO吗?如果你想穿插换行符,标准的Prelude公式是:
> unlines (map show [1..10])
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
Run Code Online (Sandbox Code Playgroud)
这是你想要写的东西 - 毕竟换行符是字符而不是动作.一旦你有这方面的表现,你可以申请putStrLn或writeFile "Numbers.txt"直接到这一点.所以你想要的完整操作就像这样的组合:
putStrLn . unlines . map show
Run Code Online (Sandbox Code Playgroud)
在ghci你有
> (putStrLn . unlines . map show) [1,2,3]
1
2
3
Run Code Online (Sandbox Code Playgroud)
这是我个人最喜欢的monad命令,称为序列:
sequence :: Monad m => [m a] -> m [a]
Run Code Online (Sandbox Code Playgroud)
因此你可以完全尝试:
sequence_ . map (putStrLn . show) $ [1..10]
Run Code Online (Sandbox Code Playgroud)
哪个更罗嗦,但它导致了一个我发现非常好的功能(虽然与你的问题无关):
sequence_ . intersperse (putStrLn "")
Run Code Online (Sandbox Code Playgroud)
也许这是一种丑陋的方式,但我认为这很酷.
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |