    {-# LANGUAGE TemplateHaskell #-}
    module TypeLevel.Number.Nat.Num where

    import TypeLevel.Number.Nat

    -- type N0 = $(natT 0)
    -- type N1 = $(natT 1)
    -- type N2 = $(natT 2)
    -- type N3 = $(natT 3)
    -- type N4 = $(natT 4)
    -- type N5 = $(natT 5)
    -- type N6 = $(natT 6)
    -- type N7 = $(natT 7)
    -- type N8 = $(natT 8)
    -- type N9 = $(natT 9)

    -- Workaround for GHC bug #4364
    --   http://hackage.haskell.org/trac/ghc/ticket/4364
    type N0 =            Z
    type N1 =          I Z
    type N2 =       O (I Z)
    type N3 =       I (I Z)
    type N4 =    O (O (I Z))
    type N5 =    I (O (I Z))
    type N6 =    O (I (I Z))
    type N7 =    I (I (I Z))
    type N8 = O (O (O (I Z)))
    type N9 = I (O (O (I Z)))

    n0 :: N0; n0 :: N0
    n0 = N0
    forall a. HasCallStack => a
    undefined
    n1 :: N1; n1 :: N1
    n1 = N1
    forall a. HasCallStack => a
    undefined
    n2 :: N2; n2 :: N2
    n2 = N2
    forall a. HasCallStack => a
    undefined
    n3 :: N3; n3 :: N3
    n3 = N3
    forall a. HasCallStack => a
    undefined
    n4 :: N4; n4 :: N4
    n4 = N4
    forall a. HasCallStack => a
    undefined
    n5 :: N5; n5 :: N5
    n5 = N5
    forall a. HasCallStack => a
    undefined
    n6 :: N6; n6 :: N6
    n6 = N6
    forall a. HasCallStack => a
    undefined
    n7 :: N7; n7 :: N7
    n7 = N7
    forall a. HasCallStack => a
    undefined
    n8 :: N8; n8 :: N8
    n8 = N8
    forall a. HasCallStack => a
    undefined
    n9 :: N9; n9 :: N9
    n9 = N9
    forall a. HasCallStack => a
    undefined