Many types of String (ByteString)

帅比萌擦擦* 提交于 2019-12-21 07:04:35

问题


I wish to compress my application's network traffic.

According to the (latest?) "Haskell Popularity Rankings", zlib seems to be a pretty popular solution. zlib's interface uses ByteStrings:

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

I am using regular Strings, which are also the data types used by read, show, and Network.Socket:

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

So to compress my strings, I need some way to convert a String to a ByteString and vice-versa. With hoogle's help, I found:

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

Trying to use it:

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

Fails, because (?) there are different types of ByteString ?

So basically:

  • Are there several types of ByteString? What types, and why?
  • What's "the" way to convert Strings to ByteStrings?

Btw, I found that it does work with Data.ByteString.Lazy.Char8's ByteString, but I'm still intrigued.


回答1:


There are two kinds of bytestrings: strict (defined in Data.Bytestring.Internal) and lazy (defined in Data.Bytestring.Lazy.Internal). zlib uses lazy bytestrings, as you've discovered.




回答2:


The function you're looking for is:

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

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

I expect it can be written more concisely without the x. (i.e. point-free, but I'm new to Haskell.)




回答3:


A more efficient mechanism might be to switch to a full bytestring-based layer:

  • network.bytestring for bytestring sockets
  • lazy bytestrings for compressoin
  • binary of bytestring-show to replace Show/Read


来源:https://stackoverflow.com/questions/1451755/many-types-of-string-bytestring

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!