module Data.Type.Heterogeneous where
{
    import Data.Kind;
    import Data.Type.Equality;

    data HetEq (a :: ka) (b :: kb) where
    {
        ReflH :: forall (k :: *) (t :: k). HetEq t t;
    };

    -- | somewhat awkwardly named
    ;
    homoHetEq :: forall (k :: *) (a :: k) (b :: k). HetEq a b -> a :~: b;
    homoHetEq ReflH = Refl;

    class TestHetEquality (w :: forall k. k -> *) where
    {
        testHetEquality :: forall (ka :: *) (a :: ka) (kb :: *) (b :: kb). w a -> w b -> Maybe (HetEq a b);
    };
}