Kinds Workaround

Ashley Yakeley ashley@semantic.org
Fri, 8 Feb 2002 17:35:25 -0800


At 2002-02-08 03:36, Koen Claessen wrote:

>Here, you might do the following trick:
>
>  type HasKind_Help         x dummy = x
>  type HasKind_Star_To_Star x       = HasKind_Help x (x Int)
>
>  type C c x y = c (HasKind_Star_To_Star x)
>                   (HasKind_Star_To_Star y)
>
>  type Composer c =
>    forall x y z . C c y z -> C c x y -> C c x z

Yuck... I discovered a much simpler workaround, a class which has a 
parameter of kind '*':

    class T a where
        {
        undef :: a; -- force kind '*'
        };

    instance T a where -- true for all types
        {
        undef = undefined;
        };

    data (T (p Bool),T (q Bool)) => CMap0 p q = MkCMap0;

    type Composer c = forall x y z. (T (x Bool)) => (c y z) -> (c x y) -> 
(c x z);

Neat, huh? Finally, a reason for allowing contexts in data type 
declarations!


-- 
Ashley Yakeley, Seattle WA