首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多种类型的字符串(ByteString)

多种类型的字符串(ByteString)
EN

Stack Overflow用户
提问于 2009-09-20 19:10:27
回答 3查看 4.4K关注 0票数 17

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

根据(最新的?) "Haskell Popularity Rankings"zlib似乎是一个相当流行的解决方案。zlib的接口使用ByteStrings:

代码语言:javascript
复制
compress :: ByteString -> ByteString
decompress :: ByteString -> ByteString

我使用的是常规String,它们也是readshowNetwork.Socket使用的数据类型

代码语言:javascript
复制
sendTo :: Socket -> String -> SockAddr -> IO Int
recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)

因此,为了压缩字符串,我需要某种方法将String转换为ByteString,反之亦然。在hoogle的帮助下,我发现:

代码语言:javascript
复制
Data.ByteString.Char8 pack :: String -> ByteString

尝试使用它:

代码语言:javascript
复制
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有几种类型吗?什么类型?为什么?
  • 什么是将Strings转换为why的方法?

顺便说一句,我发现它可以在Data.ByteString.Lazy.Char8ByteString上运行,但我仍然很感兴趣。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-20 20:58:51

有两种类型的字节串:严格(在Data.Bytestring.Internal中定义)和惰性(在Data.Bytestring.Lazy.Internal中定义)。正如您所发现的,zlib使用惰性字节串。

票数 10
EN

Stack Overflow用户

发布于 2012-06-15 22:53:53

您要查找的函数是:

代码语言:javascript
复制
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的新手)。

票数 8
EN

Stack Overflow用户

发布于 2009-09-20 19:41:14

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

字串套接字的

  • network.bytestring用于字节串的compressoin
  • binary的
  • 延迟字符串-显示以替换显示/读取
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1451755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档