[Haskell] Re: A puzzle and an annoying feature

oleg at pobox.com oleg at pobox.com
Wed Nov 24 20:38:01 EST 2004


Andrew Bromage wrote:

> module FD where
>
> class C from to | from -> to where
>      g :: from -> to
>      h :: to -> from
>
> instance C Char Bool where
>      g c = c == 'T'
>      h b = if b then 'T' else 'F'
>
> --f :: (C Char a) => Char -> a
> f c = g c

Indeed, functional dependencies are the way to close a class that is
_visible_ to the typechecker (unlike the export directive that has no
such significance, at least to the inference algorithm).

The problem is that we wish to give 'f' a signature, like the one in
the commented code, but we cannot use the type variable 'a'. We must
use Bool -- which is silly as the typechecker would have figures it
out anyway.

> This is a pretty serious problem when you're doing typeclass
> metaprogramming.  In this case, the type you're trying to find is
> Bool.  In general, it might be a large complex type, generated by
> the class C as a typeclass metaprogram, which you don't want to put
> in the type signature for maintainability reasons.

Here's the way to solve the problem -- which is actually the problem
with the sequencing of FD resolution and other actions. The following
are the changes:


> instance (TypeCast Bool a, TypeCast a Bool) => C Char a where
>      g c = typeCast $ c == 'T'
>      h b = if (typeCast b) then 'T' else 'F'
>
> f :: (C Char a) => Char -> a
> f c =  g c
>
> -- snipped verbatim from the HList library
> class TypeCast   a b   | a -> b, b->a   where typeCast   :: a -> b
> class TypeCast'  t a b | t a -> b, t b -> a where typeCast'  :: t->a->b
> class TypeCast'' t a b | t a -> b, t b -> a where typeCast'' :: t->a->b
> instance TypeCast'  () a b => TypeCast a b where typeCast x = typeCast' () x
> instance TypeCast'' t a b => TypeCast' t a b where typeCast' = typeCast''
> instance TypeCast'' () a a where typeCast'' _ x  = x

The reason for TypeCast existence is to suitably delay the FD
resolution. TypeCast has permitted a lot of code that seemed
impossible.



More information about the Haskell mailing list