ビットと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>