簡單的問題,但我似乎無法弄清楚。我有一個列表,我想在它自己的行上打印出它的每個元素。我可以做GHCi中的換行符
map show [1..10]
例如,它會將它們全部打印在一起,但沒有換行符。我的想法是做map (putStrLn $ show) [1..10]
但這不會工作,因爲我只是回到[IO()]
。有什麼想法嗎?
簡單的問題,但我似乎無法弄清楚。我有一個列表,我想在它自己的行上打印出它的每個元素。我可以做GHCi中的換行符
map show [1..10]
例如,它會將它們全部打印在一起,但沒有換行符。我的想法是做map (putStrLn $ show) [1..10]
但這不會工作,因爲我只是回到[IO()]
。有什麼想法嗎?
試試這個:mapM_ (putStrLn . show) [1..10]
這是我個人最喜歡的單子命令調用sequence:
sequence :: Monad m => [m a] -> m [a]
因此你可以完全嘗試:
sequence_ . map (putStrLn . show) $ [1..10]
哪個更羅嗦,但它會導致高達一個功能,我覺得很不錯(雖然不涉及你的問題):
sequence_ . intersperse (putStrLn "")
也許一個醜陋的做法,但我認爲這很酷。
這些答案不是太過強調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
好點,但我在IO領域回答,因爲OP說「我想打印出它自己的每一個元素」 – 2011-03-01 05:19:43
可以簡化爲:'mapM_打印[1..10]' – 2011-03-01 04:02:13
@Ed」 ka:真的,這幾乎就像打印應該這樣定義......哦,等等:D http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/System-IO.html#打印 – 2011-03-01 05:14:34