2011-03-01 45 views
2

簡單的問題,但我似乎無法弄清楚。我有一個列表,我想在它自己的行上打印出它的每個元素。我可以做GHCi中的換行符

map show [1..10] 

例如,它會將它們全部打印在一起,但沒有換行符。我的想法是做map (putStrLn $ show) [1..10]但這不會工作,因爲我只是回到[IO()]。有什麼想法嗎?

回答

6

試試這個:mapM_ (putStrLn . show) [1..10]

+7

可以簡化爲:'mapM_打印[1..10]' – 2011-03-01 04:02:13

+0

@Ed」 ka:真的,這幾乎就像打印應該這樣定義......哦,等等:D http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/System-IO.html#打印 – 2011-03-01 05:14:34

6

這是我個人最喜歡的單子命令調用sequence

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

因此你可以完全嘗試:

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

哪個更羅嗦,但它會導致高達一個功能,我覺得很不錯(雖然不涉及你的問題):

sequence_ . intersperse (putStrLn "") 

也許一個醜陋的做法,但我認爲這很酷。

9

這些答案不是太過強調IO嗎?如果你想換行散佈的標準前奏公式爲:

> unlines (map show [1..10]) 
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 

這是你想書面的事情 - 換行字符都沒有動作,畢竟。一旦你有了它的表達,你可以直接應用putStrLnwriteFile "Numbers.txt"。所以,你要完整的操作是這樣組成:

putStrLn . unlines . map show 

ghci你不得不

> (putStrLn . unlines . map show) [1,2,3] 
1 
2 
3 
+1

好點,但我在IO領域回答,因爲OP說「我想打印出它自己的每一個元素」 – 2011-03-01 05:19:43