2013-01-01 30 views
3

我正在編寫一個Haskell函數,該函數對ByteString值的列表進行操作。我需要對第一個和最後一個項目執行不同的操作(如果列表中只有一個項目,則可能會相同)。具有不同第一個和最後一個函數的Haskell映射(?)操作

具體來說,我想寫出如下:

"item-1\ 
    \item-2\ 
    \item-3\ 
    ... 
    \item-n" 

其中item-1開始用雙引號,用反斜槓結束,item-n開始用一個反斜槓和一個雙引號結束。 item-1item-n之間的所有項目以反斜槓開始和結束。我發佈了一個base64編碼值,作爲Haskell String用於某些代碼生成。我已經將原始(長)base64編碼ByteString分成長度爲64個字符的塊。

回答

11

我剛剛意識到我的問題是一個愚蠢的問題。

我可以只使用intercalate注入項目之間的"\\\n\\"然後前置和後置雙引號:

import qualified Data.ByteString.Lazy.Char8 as L 
(L.pack "\"") `L.append` (L.intercalate "\\\n\\" items) `L.append` (L.pack "\"") 

輸出示例:

"H4sIAAAAAA\ 
\AAA2NgAAMm\ 
\CMXA7JRYxI\ 
\Am5JafD2Uy\ 
\AgDvdHs6Lg\ 
\AAAA==\ 
\" 
+0

你也許知道這一點,但如果這些文件變得冗長而複雜,你可以看看'Data.ByteString.Lazy.Builder'。你的情況類似於'encodeUtf8CSV',用作文檔頁面頂部的插圖http://www.haskell.org/ghc/docs/7.6.1/html/libraries/bytestring-0.10.0.0/ Data-ByteString-Lazy-Builder.html – applicative

+0

我會看看它。謝謝。 – Ralph

1

您也可以考慮拆分使用列表:

  • 「head」得到列表的第一個元素
  • 「尾巴」讓所有,但該列表的第一個元素
  • 「初始化」讓所有但名單
  • 「最後」以獲取列表
的最後一個元素的最後一個元素

因此[head a] ++ init (tail a) ++ [last a] == a

這樣,您可以單獨更改列表的第一個和最後一個元素,並將函數映射到「init」部分。

+1

雖然效率很低。 'init'和'last'都需要遍歷整個列表,這是非常不必要的。 – leftaroundabout

+0

我知道有更高效的方法來做這件事,但這是一個非常簡單的方法。我開始做這樣的事情,然後找出如何改進它們。 –

相關問題