2016-09-19 90 views
2

在Haskell中,似乎按位操作通常通過Data.Bits module和Bits類來處理。ByteString上的按位操作

我想對任何長度的ByteStrings(例如set,clear,shift,masks ...)執行位操作,但是我無法在任何地方找到ByteStrings的位實例。

我的問題:我應該自己實施實例嗎(可能是一個很好的練習)?如果有,有什麼建議可以獲得一些「可接受的性能」?或者,嘗試直接在ByteStrings上進行位操作是一個壞主意,在這種情況下,更好的方法是什麼?

+1

對於按位運算,可以使用'zipWith'和字級操作。 – Alec

回答

1

我看不出任何理由爲什麼這是一個壞主意。如果你想成爲超級一般來說,你可以實現

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

這會給你任何list-like類型,這恰好include Bytestrings一個位實現。

+3

「我不明白爲什麼這是一個壞主意」,除非這是一個圖書館。不要在庫中放置像這樣的孤立實例。 – Cubic

+1

假設實例看起來像'instance(ListLike l a,Bits a)=> Bits l where ...'。但是,你實際上重疊了每一個Bits的實例。 *可能不是一個好主意,用*那種特殊的方式來做到這一點。 –

+0

他們建議像'newtype AggregateBits a = AggregateBits a'這樣的東西,我建議在前提條件下使用'FiniteBits'而不是'Bits'。另外,'l'是'Listlike'的完整類型,而不是'l a'。總而言之,'instance(Listlike l a,FiniteBits a)=> Bits(AggregateBits l)where ...' – NovaDenizen

0

我在Hackage上發現了bits-bytestring軟件包,提供您所要求的。

但我會小心一些操作,如果不是所有的字節長度都是相同的。特別是,哪些位由complement設置取決於字節串的長度。