| x == maxBound = error $ "Enum.succ{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to take `succ' of maxBound"
| otherwise = x + 1
succ x
| x == maxBound = error $ "Enum.succ{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to take `succ' of maxBound"
| otherwise = x + 1
@@ -72,7+72,7 @@ instance NaturalT nT => Enum (Index nT) where
| otherwise =
fromInteger $ toInteger x
| otherwise =
fromInteger $ toInteger x
-instance NaturalT nT => Num (Index nT) where
+instance PositiveT nT => Num (Index nT) where
(Index a) + (Index b) =
fromInteger $ a + b
(Index a) * (Index b) =
(Index a) + (Index b) =
fromInteger $ a + b
(Index a) * (Index b) =
@@ -80,8+80,8 @@ instance NaturalT nT => Num (Index nT) where
(Index a) - (Index b) =
fromInteger $ a - b
fromInteger n
(Index a) - (Index b) =
fromInteger $ a - b
fromInteger n
- | n > fromIntegerT (undefined :: nT) =
- error $ "Num.fromInteger{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to make Index larger than " ++ show (fromIntegerT (undefined :: nT)) ++ ", n: " ++ show n
+ | n >= fromIntegerT (undefined :: nT) =
+ error $ "Num.fromInteger{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to make Index larger than " ++ show (fromIntegerT (undefined :: nT) - 1) ++ ", n: " ++ show n
fromInteger n
| n < 0 =
error $ "Num.fromInteger{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to make Index smaller than 0, n: " ++ show n
fromInteger n
| n < 0 =
error $ "Num.fromInteger{Index " ++ show (fromIntegerT (undefined :: nT)) ++ "}: tried to make Index smaller than 0, n: " ++ show n
@@ -94,10+94,10 @@ instance NaturalT nT => Num (Index nT) where
| otherwise =
1
| otherwise =
1
-instance NaturalT nT => Real (Index nT) where
+instance PositiveT nT => Real (Index nT) where
toRational n = toRational $ toInteger n
toRational n = toRational $ toInteger n
-instance NaturalT nT => Integral (Index nT) where
+instance PositiveT nT => Integral (Index nT) where
a `quotRem` b =
let (quot, rem) = toInteger a `quotRem` toInteger b
in (fromInteger quot, fromInteger rem)
a `quotRem` b =
let (quot, rem) = toInteger a `quotRem` toInteger b