许多类型的String(ByteString)

时间:2009-09-20 19:10:27

标签: haskell bytestring

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

根据(最新?)"Haskell Popularity Rankings"zlib似乎是一个非常受欢迎的解决方案。 zlib的界面使用ByteString s:

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

我使用的是常规String,这也是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转换为ByteString s的“方法”是什么?

顺便说一句,我发现它确实与Data.ByteString.Lazy.Char8的{​​{1}}有效,但我仍然很感兴趣。

3 个答案:

答案 0 :(得分:10)

有两种字节串:strict(在Data.Bytestring.Internal中定义)和lazy(在Data.Bytestring.Lazy.Internal中定义)。正如您所发现的,zlib使用延迟字节串。

答案 1 :(得分:8)

您正在寻找的功能是:

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的新手。)

答案 2 :(得分:6)

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

  • 用于bytestring套接字的network.bytestring
  • compressoin的lazy bytestrings
  • bytestring-show的二进制代替Show / Read