ByteString関連の話

2
Seizan Shimazaki @seizans

Data.ByteString.Lazy の ByteString を Data.ByteString.Char8 の ByteString に変換したり逆変換したい。(だって base64-bytestring が後者の ByteString 使ってるんだもん)

2012-09-06 12:56:18
スマートコン @mr_konn

BS.concat . LBS.toChunks と LBS.fromChunks . (:[]) ではいけないのかしらん。

2012-09-06 12:56:24
山本和彦 @kazu_yamamoto

ByteString 連続ツイート講座:Strict なByteString は Word8 の Array です。Lazy は ByteString は Strict な ByteString のリストです。ただし、リストは再発明されています。

2012-09-06 16:18:59
山本和彦 @kazu_yamamoto

それぞれの ByteString には2つのAPIがあります。Word8 を基本とするものと、Char を基本とするものです。Char を基本とするものは、内部で Word8 <-> Char の変換をします。このため少しオーバーヘッドがあります。

2012-09-06 16:20:27
山本和彦 @kazu_yamamoto

ByteString を Char の API で使うことあんまり意味がありません。もうすぐ word8 という isDigit とかを含んだライブラリを作る予定なので、さらに意味がなくなるでしょう。

2012-09-06 16:23:45
山本和彦 @kazu_yamamoto

Strict な ByteString と Lazy な ByteString の変換には、fromChunks と toChunks を使います。Lazy が Strict のリストだと分かっているなら、型を見て納得するでしょう。

2012-09-06 16:25:45
山本和彦 @kazu_yamamoto

使い捨てのプログラムを書くのなら Lazy な ByteString でもいいでしょう。でも、本格的に書くなら Strict な ByteString とConduit の組み合わせを使いましょう。この場合、Lazy な ByteString のことは忘れていいです。

2012-09-06 16:28:51
山本和彦 @kazu_yamamoto

というわけで、Strict な ByteString で、Word8 な API、つまり Data.ByteString のみを使うのがいいと思います。(String を unpack したときとかは除く。)

2012-09-06 16:30:33
山本和彦 @kazu_yamamoto

あと、文字列リテラルを ByteString で使いたい場合は、Data.ByteString.Char8 (のインスタンス宣言)を読み込む必要があります。

2012-09-06 16:32:59
二階堂ちむら or にしん @thimura

Chunk と Empty をそれぞれ (:) と [] に読み替えればわかりやすいのでは? #start_haskell

2012-09-09 14:31:40
二階堂ちむら or にしん @thimura

ちなみに chunk 関数は ByteString の長さを見て、長さが 0 なら skip する程度の処理ですので、それを無視してしまえば Chunk 型構築子そのままぐらいに考えておいても良いかと

2012-09-09 14:37:40