data-type-0.0.1: Data/Type/Nat.hs
{-# LANGUAGE ScopedTypeVariables #-}
-- .$Header$
module Data.Type.Nat where
data Z = Z
data S n = S n
zero :: Z
zero = Z
one :: S Z
one = S Z
two :: S (S Z)
two = S one
three :: S (S (S Z))
three = S two
class Nat n where
fromNat :: Enum e => n -> e
instance Nat Z where
fromNat _ = toEnum 0
instance forall n. Nat n => Nat (S n) where
fromNat _ = succ $ fromNat (undefined :: n)
-- vim: expandtab:tabstop=4:shiftwidth=4