我想压缩我的应用程序的网络流量。
按照(最新的?) “哈斯克尔人气排行榜” , 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
s到ByteString
S'
顺便说一句,我发现,它确实与工作Data.ByteString.Lazy.Char8
的ByteString
,但我仍然很感兴趣。