2010-09-15 15 views
4

我有使用大量的字符串,而它profilling一個Haskell代碼,它出現該代碼使用大量的存儲器來存儲列表[]。一個解決這個問題,而不是使用字符串Data.ByteString.Lazy,但如何從字符串到Data.ByteString.Lazy在現有的Haskell代碼?

我有什麼關心,而這樣做,

這部分代碼必須仔細看:倍,地圖,...?

感謝答覆

+0

BTW,你可以激發人們回答你的問題,如果您標記每個問題一個答案打勾接受標誌 – fuz 2010-09-15 08:44:20

回答

2

你應該知道,一個ByteString是對於像遍歷所有IT元素非常糟糕,但對於Concatation更好等

如果你想與字節串的工作,你有到字符串轉換爲字節串,就這樣做

import Data.ByteString.Lazy as B 

,並在與他們工作的每一個功能的前貼B - 大多數功能String也存在於ByteString。請注意 - 您必須將使用的字符串轉換爲具有某些功能的ByteString。

如果使用Data.ByteString.Lazy.Char8代替,則可以輕鬆使用pack,但所有大於255的字符都將被截斷。此外,這種類型更適合二進制數據和保險箱內存。

編輯:如果你想使用文本字符串,你應該考慮使用包文本。查看here瞭解更多詳情。

+2

爲什麼字節串「的東西像迭代非常糟糕」的接受?它歸結爲一個8位整數的向量;完全像C'char *'一樣。超過嚴格Bytestrings的'map'爲目標向量執行一次分配,從源向量中讀取每個字節,應用映射函數並將結果存入內存。一切都是拆箱。它受到流融合。我無法想象迭代比這更好! – jrockway 2010-09-15 10:09:05

+0

這就是我在學校時所認爲的。 – fuz 2010-09-15 12:40:15

+0

當我想到,它涉及多陣列的複製,如果你添加/刪除從字節串的頭元素(特別是加入)。但是,是的,我可能是錯的。 – fuz 2010-09-15 12:50:08

5

如果你使用GHC並有很多字符串常量都轉換代碼OverloadedStrings擴展都能得心應手。只需以下添加到您的源文件的頂部:

{-# LANGUAGE OverloadedStrings #-} 

而且你不必在你的代碼中的任何字符串文本B.pack。你可以有以下內容,例如:

​​

沒有擴展,這將給出一個錯誤,因爲你不能在一個ByteString[Char]使用==。與擴展,字符串的類型爲(IsString a) => aByteStringIsString一個實例,因此​​這裏的類型是ByteString並沒有錯誤。

+0

我也想過提出這個問題,但由於它是一種語言擴展,它可能會破壞可移植性。 – fuz 2010-09-15 08:42:00

+3

Haskell編寫軟件的人使用GHC以外的東西嗎?哦。 – jrockway 2010-09-15 10:03:37

+0

是的,確實如此。例如有人告訴我,Utrecht Haskell編譯器有時可以創建更快的代碼。 – fuz 2010-09-15 12:41:52

相關問題