data-type-0.1.0: Data/Type/Nat.hs
{-# LANGUAGE ScopedTypeVariables #-}
-- .$Header: c:/Source/Haskell/Type/Data/Type/RCS/Nat.hs,v 1.1 2011/03/05 00:32:26 dosuser Exp dosuser $
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