我有使用大量的字符串,而它profilling一個Haskell代碼,它出現該代碼使用大量的存儲器來存儲列表[]。一個解決這個問題,而不是使用字符串Data.ByteString.Lazy,但如何從字符串到Data.ByteString.Lazy在現有的Haskell代碼?
我有什麼關心,而這樣做,
這部分代碼必須仔細看:倍,地圖,...?
感謝答覆
我有使用大量的字符串,而它profilling一個Haskell代碼,它出現該代碼使用大量的存儲器來存儲列表[]。一個解決這個問題,而不是使用字符串Data.ByteString.Lazy,但如何從字符串到Data.ByteString.Lazy在現有的Haskell代碼?
我有什麼關心,而這樣做,
這部分代碼必須仔細看:倍,地圖,...?
感謝答覆
你應該知道,一個ByteString
是對於像遍歷所有IT元素非常糟糕,但對於Concatation更好等
如果你想與字節串的工作,你有到字符串轉換爲字節串,就這樣做
import Data.ByteString.Lazy as B
,並在與他們工作的每一個功能的前貼B
- 大多數功能String
也存在於ByteString
。請注意 - 您必須將使用的字符串轉換爲具有某些功能的ByteString。
如果使用Data.ByteString.Lazy.Char8
代替,則可以輕鬆使用pack
,但所有大於255的字符都將被截斷。此外,這種類型更適合二進制數據和保險箱內存。
編輯:如果你想使用文本字符串,你應該考慮使用包文本。查看here瞭解更多詳情。
如果你使用GHC並有很多字符串常量都轉換代碼OverloadedStrings擴展都能得心應手。只需以下添加到您的源文件的頂部:
{-# LANGUAGE OverloadedStrings #-}
而且你不必在你的代碼中的任何字符串文本B.pack
。你可以有以下內容,例如:
沒有擴展,這將給出一個錯誤,因爲你不能在一個ByteString
和[Char]
使用==
。與擴展,字符串的類型爲(IsString a) => a
和ByteString
是IsString
一個實例,因此這裏的類型是ByteString
並沒有錯誤。
BTW,你可以激發人們回答你的問題,如果您標記每個問題一個答案打勾接受標誌 – fuz 2010-09-15 08:44:20