我希望压缩我的应用程序的网络流量。
根据(最新?)“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)
所以要压缩我的字符串,我需要一些方法来将 a 转换String
为 a 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
将s转换为 s 的“方法”是ByteString
什么?
顺便说一句,我发现它确实适用于Data.ByteString.Lazy.Char8
's ByteString
,但我仍然很感兴趣。