我希望压缩我的应用程序的网络流量.
根据(最新的?)"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"):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
,但我仍然很感兴趣.
有两种字节串:strict(在Data.Bytestring.Internal中定义)和lazy(在Data.Bytestring.Lazy.Internal中定义).正如您所发现的,zlib使用延迟的字节串.
您正在寻找的功能是:
import Data.ByteString as BS import Data.ByteString.Lazy as LBS lazyToStrictBS :: LBS.ByteString -> BS.ByteString lazyToStrictBS x = BS.concat $ LBS.toChunks x
我希望在没有x的情况下可以更简洁地编写.(即没有点,但我是Haskell的新手.)
更有效的机制可能是切换到完整的基于字节串的层:
用于bytestring套接字的network.bytestring
压缩字的延迟字节串
bytestring-show的二进制代替Show/Read