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 aByteString
s?
Por cierto, encontré que funciona con Data.ByteString.Lazy.Char8
''s ByteString
, pero todavía estoy intrigado.
Hay dos tipos de bytestrings: estricto (definido en Data.Bytestring.Internal ) y perezoso (definido en Data.Bytestring.Lazy.Internal ). zlib usa bytestrings perezosos, como has descubierto.
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