许多类型的字符串(字节字符串)(Many types of String (ByteString))

2019-08-08 05:44发布

我想压缩我的应用程序的网络流量。

按照(最新的?) “哈斯克尔人气排行榜” , zlib的似乎是一个很受欢迎的解决方案。 zlib的的接口使用ByteString S:

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

我使用普通String s,这也是由所使用的数据类型readshowNetwork.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.Char8ByteString ,但我仍然很感兴趣。

Answer 1:

有两种类型的字节串的:严格(定义在Data.Bytestring.Internal )和懒惰(定义Data.Bytestring.Lazy.Internal )。 zlib的使用懒惰字节串,因为你已经发现。



Answer 2:

你要找的功能是:

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



Answer 3:

一种更有效的机制可能是切换到一个完整的基于字节串层:

  • network.bytestring的字节串插座
  • 懒惰的字节串为compressoin
  • 的字节串秀二进制更换显示/阅读


文章来源: Many types of String (ByteString)