2016-09-19 2 views
2

하스켈에서 일반적으로 비트 단위 연산은 Data.Bits module 및 비트 클래스를 통해 처리되는 것으로 보입니다.ByteString의 비트 단위 연산

ByteStrings에 대해 임의의 길이 (예 : set, clear, shift, masks ...)를 수행하고 싶습니다. 그러나 ByteString에 대한 비트의 인스턴스를 찾을 수 없습니다.

내 질문 : 인스턴스를 직접 구현해야합니까 (아마도 좋은 운동일까요)? 그렇다면 "수용 가능한 성능"을 얻기위한 권장 사항이 있습니까? 또는 ByteString에 비트 조작을 직접 시도하는 것이 좋지 않은 경우 더 좋은 방법이 무엇일까요?

+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 ... '와 같이 보일 것입니다. 그러나 그때 당신은 문자 그대로 '비트 (Bit)'의 모든 다른 인스턴스와 중복됩니다. 아마 그 특별한 방법으로 이것을하는 것은 좋은 생각이 아닙니다. –

+0

그들은 'newtype AggregateBits a = AggregateBits a'와 같은 것을 제안하고 전제 조건에서'Bits' 대신'FiniteBits'를 사용하도록 제안합니다. 또한'l'은'llike'가 아닌'Listlike'의 전체 타입입니다. 전체적으로, 인스턴스 (Listlike l a, FiniteBits a) => 비트 (AggregateBits l) 어디에서 ... ' – NovaDenizen

0

요청한 것을 제공하는 Hackage에서 bits-bytestring 패키지를 발견했습니다.

그러나 일부 작업의 경우 조심해야하며 모든 바이트 단위의 길이가 같은 것은 아닙니다. 특히, 어떤 비트가 complement에 의해 설정되는지는 바이트 테스트의 길이에 따라 다릅니다.