ビットとview pattern

小ネタ。 ビットパターンをHaskellでパターンマッチできたらいいよね、ということでview patternを使ってみた。

{-# LANGUAGE ViewPatterns #-}
import Data.Bits

-- | ビット。 I は 1, O は 0
data B = I | O deriving Show

-- | 8ビット。 左がMSB, 右がLSB
data Byte = B B B B B B B B B deriving Show

bool2b :: Bool -> B
bool2b True = I; bool2b False = O

bit' :: Bits a => Int -> a -> B
bit' i b = bool2b $ testBit b i


-- | view patternで使う関数
bit8 :: Bits a => a -> Byte
bit8 b = B (bit' 7 b) (bit' 6 b) (bit' 5 b) (bit' 4 b) (bit' 3 b) (bit' 2 b) (bit' 1 b) (bit' 0 b)


-- 使い方

isMsbOn :: Bits a => a -> Bool -- 名前は適当
isMsbOn (bit8 -> B I _ _ _ _ _ _ _) = True -- view pattern
isMsbOn _ = False

isLsbOn :: Bits a => a -> Bool
isLsbOn (bit8 -> B _ _ _ _ _ _ _ I) = True -- view pattern
isLsbOn _ = False
Main> isMsbOn (128::Int)
True
Main> isMsbOn (100::Int)
False
Main> isLsbOn (100::Int)
False
Main> isLsbOn (101::Int)
True
Main>