17

アプリケーションのネットワーク トラフィックを圧縮したいと考えています。

(最新の?) "Haskell Popularity Rankings"によると、zlibはかなり人気のあるソリューションのようです。zlib のインターフェースはByteStrings を使用します:

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

これは、 、、および でString使用されるデータ型でもあります。readshowNetwork.Socket

sendTo :: Socket -> String -> SockAddr -> IO Int
recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)

したがって、文字列を圧縮するには、aStringを a に、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ますか? どのような種類で、その理由は?
  • Strings をsに変換する「the」方法は何ByteStringですか?

ところで、私はそれがData.ByteString.Lazy.Char8'sByteStringで動作することを発見しましたが、私はまだ興味をそそられています。

4

3 に答える 3

10

バイト文字列には、strict( Data.Bytestring.Internalで定義)とlazy(Data.Bytestring.Lazy.Internalで定義)2種類があります。ご存知のように、zlibは遅延バイト文字列を使用します。

于 2009-09-20T20:58:51.223 に答える
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 は初めてです。)

于 2012-06-15T14:53:53.340 に答える
6

より効率的なメカニズムは、完全なバイト文字列ベースのレイヤーに切り替えることです。

  • バイト文字列ソケット用の network.bytestring
  • 圧縮用の遅延バイト文字列
  • Show/Read を置き換える bytestring-show のバイナリ
于 2009-09-20T19:41:13.547 に答える