2016-09-19 28 views
2

ハスケルでは、ビット単位の操作は通常、Data.Bits moduleとBitsクラスを使用して処理されるようです。ByteStringのビット単位操作

任意の長さのByteString(例:set、clear、shift、masks ...)でビット操作を実行したいが、どこでもByteStringsのビットのインスタンスを見つけることができない。

私の質問:インスタンスを自分で実装する必要がありますか?もしそうなら、「許容可能なパフォーマンス」を得るための勧告がありますか?または、ByteStringsでビット操作を直接行うことをお勧めします。この場合、より良い方法は何でしょうか?

+1

ビット単位の操作では、 'zipWith'と単語レベル操作を使用できます。 – Alec

答えて

1

なぜそれが悪い考えであるかはわかりません。あなたはスーパーの一般的になりたかった場合は、これはあなたにinclude Bytestringsに起こるあらゆるlist-likeタイプ、のためのビットの実装を与える

instance (Listlike l a, Bits a) => Bits (l a) where ... 

実装することができます。

+3

「これはライブラリにとっての場合を除いて、悪い考えである理由は何もわかりません。ライブラリに孤立したインスタンスを置かないでください。 – Cubic

+1

おそらく、インスタンスは 'instance(ListLike l a、Bits a)=> Bits l where ...'のようになります。しかし、その後、あなたは文字通り 'ビット(Bits) 'のすべてのインスタンスをオーバーラップしています。おそらくこれを*特定の方法で行うのは良い考えではありません。 –

+0

彼らは 'newtype AggregateBits a = AggregateBits a'のようなものを提案しています。前提条件で' Bits'の代わりに 'FiniteBits'を使うことを提案します。' l'は 'llike'ではなく' Listlike'の完全型です。全体的に、インスタンス(Listlike l a、FiniteBits a)=>ビット(AggregateBits l)where ... ' – NovaDenizen

0

あなたが求めるものを提供しているHackageにbits-bytestringパッケージが見つかりました。

しかし、すべてのバイト列が同じ長さでない場合は、いくつかの操作には注意が必要です。特に、complementによってどのビットが設定されるかは、バイト文字列の長さに依存する。

関連する問題