Haskell ByteString上的位操作

Haskell ByteString上的位操作,haskell,bit-manipulation,bytestring,Haskell,Bit Manipulation,Bytestring,在Haskell中,按位操作似乎通常通过和Bits类进行处理 我想对任何长度的bytestring执行位操作(例如set、clear、shift、masks…),但我在任何地方都找不到bytestring的位实例 我的问题:我应该自己实现这个实例吗(可能是一个很好的练习)?如果有的话,是否有获得“可接受性能”的建议?或者尝试直接在ByTestRing上进行位操作是一个坏主意,在这种情况下,有什么更好的方法呢?我看不出这是一个坏主意的任何原因。如果你想成为超级通用,你可以实现 instance (

在Haskell中,按位操作似乎通常通过和Bits类进行处理

我想对任何长度的bytestring执行位操作(例如set、clear、shift、masks…),但我在任何地方都找不到bytestring的位实例


我的问题:我应该自己实现这个实例吗(可能是一个很好的练习)?如果有的话,是否有获得“可接受性能”的建议?或者尝试直接在ByTestRing上进行位操作是一个坏主意,在这种情况下,有什么更好的方法呢?

我看不出这是一个坏主意的任何原因。如果你想成为超级通用,你可以实现

instance (Listlike l a, Bits a) => Bits (l a) where ...
这将为您提供任何类型的Bits实现,这发生在。

我在Hackage上找到了提供您所需内容的软件包


但是如果不是所有的bytestring都具有相同的长度,我会小心处理一些操作。特别是,哪些位由
补码设置取决于bytestring的长度。

对于按位操作,可以使用
zipWith
和字级操作。“我看不出有任何理由认为这是一个坏主意”,除非这是用于库。不要将这样的孤立实例放在库中。该实例可能看起来像
实例(类似列表的l a,位a)=>位l where…
。但是,您实际上是在重叠
位的每一个其他实例。这样做可能不是一个好主意。他们建议像
newtype AggregateBits a=AggregateBits a
这样的东西,我建议在前提条件中使用
FiniteBits
而不是
Bits
,而且,
l
Listlike
的完整类型,而不是
la
。总之,
实例(类似列表的l a,FiniteBits a)=>位(聚合息税前利润l),其中…