witness-0.3: src/Data/Witness/Nat.hs
module Data.Witness.Nat where
{
import Prelude hiding (id,(.));
import Data.Maybe;
import Data.Type.Equality;
import Data.Constraint(Dict(..));
import Data.Witness.Representative;
data NatKind = Zero | Succ NatKind;
data Nat (t :: NatKind) where
{
ZeroNat :: Nat Zero;
SuccNat :: Nat t -> Nat (Succ t);
};
instance TestEquality Nat where
{
testEquality ZeroNat ZeroNat = return Refl;
testEquality (SuccNat a) (SuccNat b) = do
{
Refl <- testEquality a b;
return Refl;
};
testEquality _ _ = Nothing;
};
instance Eq1 Nat where
{
equals1 a b = isJust (testEquality a b);
};
instance Representative Nat where
{
getRepWitness ZeroNat = Dict;
getRepWitness (SuccNat n) = case getRepWitness n of
{
Dict -> Dict;
};
};
instance Is Nat Zero where
{
representative = ZeroNat;
};
instance (Is Nat n) => Is Nat (Succ n) where
{
representative = SuccNat representative;
};
}