Многие типы String (ByteString) - PullRequest
       7

Многие типы String (ByteString)

16 голосов
/ 20 сентября 2009

Я хочу сжать сетевой трафик моего приложения.

Согласно (последним?) "рейтингам популярности Haskell" , zlib представляется довольно популярным решением. Интерфейс zlib использует ByteString s:

compress :: ByteString -> ByteString
decompress :: ByteString -> ByteString

Я использую обычные String s, которые также являются типами данных, используемыми read, show и Network.Socket:

sendTo :: Socket -> String -> SockAddr -> IO Int
recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)

Итак, чтобы сжать мои строки, мне нужно каким-то образом преобразовать String в ByteString и наоборот. С помощью hoogle я нашел:

Data.ByteString.Char8 pack :: String -> ByteString

Попытка его использовать:

Prelude Codec.Compression.Zlib Data.ByteString.Char8> compress (pack "boo")

<interactive>:1:10:
    Couldn't match expected type `Data.ByteString.Lazy.Internal.ByteString'
           against inferred type `ByteString'
    In the first argument of `compress', namely `(pack "boo")'
    In the expression: compress (pack "boo")
In the definition of `it': it = compress (pack "boo")

Сбой, потому что (?) Существуют различные типы ByteString?

Итак, в основном:

  • Есть ли несколько типов ByteString? Какие типы и почему?
  • Какой "способ" преобразования String с в ByteString с?

Кстати, я обнаружил, что он работает с Data.ByteString.Lazy.Char8 ByteString, но я все еще заинтригован.

Ответы [ 3 ]

10 голосов
/ 21 сентября 2009

Существует два вида строк байтов: строгие (определены в Data.Bytestring.Internal ) и ленивые (определены в Data.Bytestring.Lazy.Internal ). Как вы обнаружили, zlib использует ленивые строки байтов.

8 голосов
/ 15 июня 2012

Функция, которую вы ищете:

import Data.ByteString as BS
import Data.ByteString.Lazy as LBS

lazyToStrictBS :: LBS.ByteString -> BS.ByteString
lazyToStrictBS x = BS.concat $ LBS.toChunks x

Я ожидаю, что это может быть написано более кратко без x. (т.е. без очков, но я новичок в Хаскеле.)

6 голосов
/ 20 сентября 2009

Более эффективным механизмом может быть переключение на полный слой на основе строк:

  • network.bytestring для сокетов bytestring
  • Ленивые строки для сжатия
  • двоичный файл bytestring-show для замены Show / Read
...