2

単純な質問ですが、私はそれを理解できないようです。リストがあり、その各要素をそれぞれの行に出力したいと考えています。できます

map show [1..10]

たとえば、それらをすべてまとめて出力しますが、改行はありません。私の考えはそうすることmap (putStrLn $ show) [1..10]でしたが、私は[IO()]. 何かご意見は?

4

3 に答える 3

9

これらの回答は 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
于 2011-03-01T05:14:33.323 に答える
6

これを試して:mapM_ (putStrLn . show) [1..10]

于 2011-03-01T02:37:44.707 に答える
6

私が個人的に気に入っているシーケンスと呼ばれるモナドコマンドは次のとおりです。

sequence :: Monad m => [m a] -> m [a]

したがって、完全に試すことができます:

sequence_ . map (putStrLn . show) $ [1..10]

これはより冗長ですが、非常に優れていると思う関数につながります(ただし、質問とは関係ありません):

sequence_ . intersperse (putStrLn "")

それを行うには醜い方法かもしれませんが、私はそれがクールだと思いました。

于 2011-03-01T02:37:57.150 に答える