在GHCi中映射换行符

Xod*_*rap 2 haskell ghci

简单的问题,但我似乎无法弄明白.我有一个列表,我想在它自己的行上打印出它的每个元素.我可以

map show [1..10]
Run Code Online (Sandbox Code Playgroud)

例如,它将一起打印出来,但没有换行符.我的想法是这样做,map (putStrLn $ show) [1..10]但这不起作用,因为我只是回来了[IO()].有什么想法吗?

app*_*ive 9

这些答案不是过分强调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)


Joe*_*get 6

试试这个: mapM_ (putStrLn . show) [1..10]

  • 可以简化为:`mapM_ print [1..10]` (7认同)

Rob*_*oli 6

这是我个人最喜欢的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)

也许这是一种丑陋的方式,但我认为这很酷.