単純な質問ですが、私はそれを理解できないようです。リストがあり、その各要素をそれぞれの行に出力したいと考えています。できます
map show [1..10]
たとえば、それらをすべてまとめて出力しますが、改行はありません。私の考えはそうすることmap (putStrLn $ show) [1..10]
でしたが、私は[IO()]
. 何かご意見は?
これらの回答は IO に重点を置きすぎていませんか? 改行を散在させたい場合、標準のプレリュード式は次のとおりです。
> 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
これを試して:mapM_ (putStrLn . show) [1..10]
私が個人的に気に入っているシーケンスと呼ばれるモナドコマンドは次のとおりです。
sequence :: Monad m => [m a] -> m [a]
したがって、完全に試すことができます:
sequence_ . map (putStrLn . show) $ [1..10]
これはより冗長ですが、非常に優れていると思う関数につながります(ただし、質問とは関係ありません):
sequence_ . intersperse (putStrLn "")
それを行うには醜い方法かもしれませんが、私はそれがクールだと思いました。