type family (*) (a :: Nat) (b :: Nat) :: Nat type family (+) (a :: Nat) (b :: Nat) :: Nat type family (-) (a :: Nat) (b :: Nat) :: Nat type (<=) (x :: Nat) (y :: Nat) = (x <=? y) ~ 'True type family (<=?) (a :: Nat) (b :: Nat) :: Bool type family CmpNat (a :: Nat) (b :: Nat) :: Ordering type family CmpSymbol (a :: Symbol) (b :: Symbol) :: Ordering class KnownNat (n :: Nat) where natSing :: SNat n class KnownSymbol (n :: Symbol) where symbolSing :: SSymbol n data Nat data SomeNat where SomeNat :: KnownNat n => (Proxy n) -> SomeNat data SomeSymbol where SomeSymbol :: KnownSymbol n => (Proxy n) -> SomeSymbol data Symbol type family (^) (a :: Nat) (b :: Nat) :: Nat natVal :: KnownNat n => proxy n -> Integer natVal' :: KnownNat n => Proxy# n -> Integer sameNat :: (KnownNat a, KnownNat b) => Proxy a -> Proxy b -> Maybe (a :~: b) sameSymbol :: (KnownSymbol a, KnownSymbol b) => Proxy a -> Proxy b -> Maybe (a :~: b) someNatVal :: Integer -> Maybe SomeNat someSymbolVal :: String -> SomeSymbol symbolVal :: KnownSymbol n => proxy n -> String symbolVal' :: KnownSymbol n => Proxy# n -> String