
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