Как перейти от строки к Data.ByteString.Lazy в существующем коде Haskell? - PullRequest
4 голосов
/ 15 сентября 2010

У меня есть код на Haskell, который использует много String, но при его профилировании кажется, что код использует много памяти для хранения списков []. Одним из решений этой проблемы является использование Data.ByteString.Lazy вместо String, но

о чем мне нужно заботиться, делая это?,

какую часть кода нужно внимательно посмотреть: сложить, отобразить, ...?

спасибо за ответ

Ответы [ 2 ]

5 голосов
/ 15 сентября 2010

Расширение OverloadedStrings может быть удобно, если вы используете GHC и конвертируете код с большим количеством строковых литералов.Просто добавьте следующее в начало вашего исходного файла:

{-# LANGUAGE OverloadedStrings #-}

И вам не нужно использовать B.pack для любых строковых литералов в вашем коде.Например, вы можете получить следующее:

equalsTest :: B.ByteString -> Bool
equalsTest x = x == "Test"

Без расширения это приведет к ошибке, поскольку вы не можете использовать == для ByteString и [Char].С расширением строковые литералы имеют тип (IsString a) => a, а ByteString является экземпляром IsString, поэтому "Test" здесь вводится как ByteString и ошибки нет.

2 голосов
/ 15 сентября 2010

Вы должны знать, что ByteString действительно плохо для таких вещей, как итерации по его элементам, но лучше для Concatation и т. Д.

Если вы хотите работать с ByteStrings, вам нужно преобразовать String в ByteString, просто сделайте что-то вроде

import Data.ByteString.Lazy as B

и вставьте B перед каждой функцией, которая работает с ними - большинство функций для String также существует для ByteString. Пожалуйста, обратите внимание - вы должны преобразовать используемые вами строки в ByteString с некоторыми функциями.

Если вместо этого вы используете Data.ByteString.Lazy.Char8, вы можете легко использовать pack, но все символы больше 255 будут усечены. Также этот тип больше подходит для двоичных данных и сейфов памяти.

Редактировать: Вам следует рассмотреть возможность использования текста пакета, если вы хотите работать с текстовыми строками. Смотрите здесь для получения более подробной информации.

...