haskell bytestring

haskell - Muchos tipos de String(ByteString)



(3)

Deseo comprimir el tráfico de red de mi aplicación.

Según el (¿más reciente?) "Clasificación de popularidad de Haskell" , zlib parece ser una solución bastante popular. La interfaz de zlib usa ByteString s:

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

Estoy usando String normales, que también son los tipos de datos utilizados por read , show y Network.Socket :

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

Entonces, para comprimir mis cadenas, necesito alguna forma de convertir una String en una ByteString y viceversa. Con la ayuda de hoogle , encontré:

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

Tratando de usarlo:

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")

Falla, porque (?) Hay diferentes tipos de ByteString ?

Así que básicamente:

  • ¿Hay varios tipos de ByteString ? ¿Qué tipos y por qué?
  • ¿Cuál es "la" manera de convertir String s a ByteString s?

Por cierto, encontré que funciona con Data.ByteString.Lazy.Char8 ''s ByteString , pero todavía estoy intrigado.



La función que estás buscando es:

import Data.ByteString as BS import Data.ByteString.Lazy as LBS lazyToStrictBS :: LBS.ByteString -> BS.ByteString lazyToStrictBS x = BS.concat $ LBS.toChunks x

Espero que se pueda escribir de forma más concisa sin la x. (es decir, sin puntos, pero soy nuevo en Haskell).


Un mecanismo más eficiente podría ser cambiar a una capa completa basada en bytestring:

  • network.bytestring para sockets de bytestring
  • bytestrings perezosos para compressoin
  • binario de bytestring-show para reemplazar Show / Read