You can also look at it in terms of the "deconstruction" operation on this data type.
For example, lists: > data List a = Nil | Cons a (List a) > > case_list :: r -> (a -> List a -> r) -> List a -> r > case_list nil_case cons_case Nil = nil_case > case_list nil_case cons_case (Cons x xs) = cons_case x xs Now, given the "Branch" type: > data Branch tok st a = forall b. Branch (PermParser tok st (b -> a)) > (GenParser tok st b) what is the type of its "case" construct? Here's the answer: > case_branch :: (forall b. PermParser tok st (b -> a) -> GenParser tok st b -> > r) -> Branch tok st a -> r > case_branch k (Branch pparser gparser) = k pparser gparser Notice the higher-rank type on the argument k; it has to be able to accept *any* type b, because the constructor hid an object of *some* type which is no longer known. So unless you can accept *any* b, you can't operate on this object. -- ryan _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe