9

遅延バイト文字列を使用して大きなデータストリームを読み取っていますが、解析中に少なくともXバイト以上使用できるかどうかを知りたいです。つまり、バイト文字列が少なくともXバイトの長さであるかどうかを知りたいのです。

それを呼び出すとlength、ストリーム全体がロードされ、遅延バイト文字列を使用する目的が無効になりますか?

はいの場合、フォローアップは次のようになります。ストリーム全体をロードせずに、少なくともXバイトがあるかどうかを確認するにはどうすればよいですか。

編集:もともと私はファイルを読むという文脈で尋ねましたが、ファイルサイズを決定するためのより良い方法があることを理解しています。しかし、私が必要とする究極の解決策は、怠惰なバイト文字列ソースに依存するべきではありません。

4

4 に答える 4

11

はい。

length . take x

于 2010-03-25T16:09:18.353 に答える
1

hFileSize :: Handle -> IO Integerファイルの長さを取得するために使用していない理由はありますか?

于 2010-03-25T16:03:55.593 に答える
0

編集:ごめんなさい。バイトストリングはリストだと思っていたと思います。バイト文字列のgenericLengthはありません。

length返されるタイプが厳密であるため、Intは厳密です。Data.Listから使用genericLengthして、怠惰なペアノ数を定義し、それらのNumインスタンスを提供するライブラリをインポートできます(例:数値ライブラリ)。

これにより、関数を希望どおりに表現できますが、ephemientの答えは機能的に同じであり、新しいライブラリをインポートする必要はありません。

私はここでこのテーマに関するブログ投稿をしました。それがあなたが興味を持っているかもしれないアプローチのように聞こえるなら:

http://coder.bsimmons.name/blog/2010/03/lazy-arithmetic-in-haskell/

于 2010-03-25T17:35:55.113 に答える
0

文字列全体を反復処理する必要がありますが、遅延バイト文字列全体への参照を他の場所に保持しない場合は、文字列の末尾に向かって進むときに文字列の先頭を解放できるはずです。

于 2010-03-29T10:48:50.393 に答える