2013-06-30 92 views
1

您好我使用IO打印[[[Char]]]時出現小問題。Haskell打印[[[Char]]]到IO

我有一個[[[Char]]]列表 - 換句話說[[String]]

我想打印出來像

FirstStringOfFirstListOfStrings 
SecondStringOfFirstListOfStrings 
. 
. 
. 
LastStringOffFirstListofStrings 
(some gap anything empty line "----" string anything) 
FirstStringOfSecondsListOfStrings 

換句話說我不希望[String]要打印一個下互相幫助(一個至少換行分隔符或者一些線充滿了------例如)

mapM_ (mapM_ print) 

我的想法是組成(mapM_ print)函數與另一個,但似乎並不工作。有什麼建議麼?

編輯:下面是一個例子,根據要求

要打印的數據:[["abc","cde","efg"],["hjk","mno","prs"],["stu","wxy","zzz"]]同時使用mapM_ (mapM_ print)

它打印像

abc 
cde 
efg 
hjk 
mno 
prs 
stu 
wxy 
zzz 

但我想它要打印這樣的:

abc 
cde 
efg 

hjk 
mno 
prs 

stu 
why 
zzz 

它們可以分開由一個空行或一些字符串。

+2

您可以通過顯示示例輸入和輸出來幫助我們。在調用IO之前,您還應該考慮使用純函數來定義要輸出的最終字符串。 –

+0

你要求我把代碼的例子 以及爲,[字符串]]主板是大不確定性algoritm的使其成爲純粹的將是十分困難 我認爲有一種方法可以做到這一點,但單子類型restrits我一個結果硬 – user2184057

回答

3

讓我們開始與類型。你有什麼是[[String]]和你想要的是[[IO()]],即每個String被轉換爲IO()行動(打印它)。讓我們試着來實現這一目標:

strToPrint :: [[String]] -> [[IO()]] 
strToPrint strs = map (map putStrLn) strs     

現在我們要[[IO()]]弄平得到[IO()]我們插入所需斷行打印動作以及同時平整的列表。

flattenActions :: [[IO()]] -> [IO()] 
flattenActions actions = concat $ intersperse [(putStrLn "")] actions 

現在我們可以通過一個採用sequence_執行這些[IO()]行動之一。似乎我們可以使用功能組合所有這些功能組合成一個功能,因此我們得到

printStrings :: [[String]] -> IO() 
printStrings = sequence_ . flattenActions . strToPrint 

而且使用它像:

main = printStrings [["a","b","c"],["d","e","f"]] 

然後,您可以尋找使這個更通用的,因此重構它。

+0

由於我是個挑逗者,我會指出'(concat。)。 intersperse == intercalate',只不過後者是(我認爲)可能更有效率。 –

2

與您的示例中的代碼,任何分隔符「九月」則是:

import Data.List (intercalate) 

let x = [["abc","cde","efg"],["hjk","mno","prs"],["stu","wxy","zzz"]] 

p sep = putStr . unlines . intercalate sep 

main = do 
    p "" x 
    p "---" x 
0

請記住,mapM_將一個函數返回一個monadic動作作爲其參數。該行爲可以是使用正常一元操作組成的 。

所以,你的代碼示例中你有:

printStrings :: [[String]] -> IO() 
printStrings = mapM_ (mapM_ putStrLn) 

而你想有:

printStrings :: [[String]] -> IO() 
printStrings = mapM_ (\xs -> (mapM_ putStrLn) xs >> putStrLn "")) 

所以我們要做的就是更換內mapM_ putStrLn與功能: \xs -> mapM_ (putStrLn xs >> putStrLn "")那也打印出分隔符。