2016-09-22 68 views
1

在我的計劃,我產生號碼的清單:哈斯克爾 - 寫入數組文件,而無需方括號

data = [2,3,2,5,2,7,2,3,2,11 ... ] 

現在我想要寫號的這個名單是在單行逗號分隔的字符串文件。我知道我可以使用writeFileShow結合:

writeFile "data.txt" $ show $ data 

然而,這也將打印的方括號在開頭和結尾。現在我可以使用reverse從字符串Show data中刪除第一個和最後一個字符,但效率不高。在某些時候,程序已經遍歷列表以便將字符寫入文件,那麼如何確保它不會寫入第一個和最後一個字符而不進行不必要的遍歷?

這會最有效地完成這項工作嗎?

writeFile "data.txt" $ drop 1 $ takeWhile (\c -> c/= ']') $ show data 

回答

3

你有什麼是好的,但我認爲一個更合適的方法是不是名單​​上使用show,但展現每個元素放入逗號自己,就像這樣:

writeFile "data.txt" . intercalate "," . map show $ [1, 2, 3] 

intercalate來自Data.List

(順便說一句:你不能叫一個變量data,因爲這是一個關鍵字)

+0

權。在編寫僞代碼時沒有想過。 – Myridium

2

你有很多的方式這樣做!您的數據轉換爲字符串,並且,你現在就可以使用它們:

在你的情況,你可以寫你這樣的代碼(列表中的每個元素被讀取一次,並直接轉換)

writeFile "data.txt" $ Data.List.foldl (\x y -> x ++ show y ++ ",") "" data 

,無最後一個逗號:從Data.List模塊

Data.List.intercalate "," $ Data.List.map (\x -> show x) data 
writeFile "data.txt" $ Data.List.tail $ Data.List.foldl (\x y -> x ++ "," ++ show y) "" data 

或使用插3210個類似的問題在計算器:你是對`data`

+1

不錯。請注意,摺疊方法將生成尾隨逗號,而插入不會。 – chi

+0

是的,對不起,這裏的解決方案:'Data.List.tail $ Data.List.foldl(\ x y - > x ++「,」++ show y)「」data'。 –

+2

'foldl'在這裏是個不錯的選擇。在'[1..1000000]'上用ghci試試看它爬行。你迫使'(++)'關聯到左邊,這使得它重複遍歷''1'''然後''1,2「'然後''1,2,3」'等等。 'foldr'。 –