
Frederik Eaton wrote:
Another thing which I don't think is mentioned in the paper, which is convenient, is that you can define HLists all of whose elements are members of a given class:
class HListShow l instance HListShow HNil instance (Show a, HListShow l) => HListShow (a :* l)
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
Keean.