[Haskell-cafe] tuple and HList

Keean Schupke k.schupke at imperial.ac.uk
Tue Mar 22 07:51:10 EST 2005


Oleg has just pointed out that the 'Show' constraint bellow does not 
work if you try and use a function from the show class (say 'show'), as 
the function:

test2 l = show l

has the type:

test2 :: forall a. (Show a) => a -> String


The technique below works to constrain for membership of a class, So we 
know all
elements in the list are instances of show, but we cannot call functions.

The best thing here is to let the compiler infer any remaining 
constraints using:

showList :: ConstrainedList SHOW l => l -> String
showList = undefined

test l
    | False = showList l
    | otherwise = show (hHead l)

Here the 'False' guard is never executed, but its type is unified with 
the inferred type for 'show l'... ghci shows us:

*Main> :type test
test :: forall b a.
        (Show a, ConstrainedList SHOW (HCons a b)) =>
        HCons a b -> String

In other words use constraints only to enforce explicit requirements, 
the compiler can safely infer all required constraints from the code (IE 
just don't give signatures for the functions).

Keean.




Keean Schupke wrote:

> You can avoid the need to declare a new class for each constrained list
> by using the following:
>
> >class Constraint c a
> >
> >data SHOW
> >instance Show a => Constraint SHOW a
> >
> >class HListConstraint c l
> >instance HListConstraint c HNil
> >instance (Constraint c a,HListConstraint c l) => HListConstraint c 
> (HCons a l)
>
> You can now constrain a list as follows:
>
> >assertShow :: HListConstraint SHOW l => l -> l
> >assertShow = id
>
> The type parameter can be made first class using:
>
> >showConstraint :: SHOW
> >showConstraint = undefined
>
> So we can now pass this as a parameter:
>
> >assertConstraintOnHList :: HListConstraint c l => c -> l -> l
> >assertConstraintOnHList _ = id
>


More information about the Haskell-Cafe mailing list