entangle-0.1.0: src/lib/BitQubitId.hs
module BitQubitId (QubitId, BitId, qubitId, toSize) where
newtype QubitId = QubitId Int deriving (Eq, Ord)
newtype BitId = BitId Int deriving (Eq, Ord)
qubitId :: Int -> QubitId
qubitId i
| i < 0 = error "Negative qubit id"
| otherwise = QubitId i
bitId :: Int -> BitId
bitId i
| i < 0 = error "Negative bit id"
| otherwise = BitId i
liftQubit :: (Int -> Int -> Int) -> QubitId -> QubitId -> QubitId
liftQubit op (QubitId a) (QubitId b) = qubitId $ op a b
instance Show QubitId where
show (QubitId i) = "qubit " ++ show i
instance Bounded QubitId where
minBound = QubitId 0
maxBound = QubitId maxBound
instance Enum QubitId where
fromEnum (QubitId i) = i
toEnum = qubitId
instance Num QubitId where
(+) = liftQubit (+)
(-) = liftQubit (-)
fromInteger = qubitId . fromIntegral
(*) = error "* makes no sense for QubitId"
abs = error "abs makes no sense for QubitId"
signum = error "signum makes no sense for QubitId"
instance Show BitId where
show (BitId i) = "bit " ++ show i
instance Bounded BitId where
minBound = BitId 0
maxBound = BitId maxBound
instance Enum BitId where
fromEnum (BitId i) = i
toEnum = bitId
toSize :: QubitId -> Integer
toSize (QubitId i) = 2 ^ i