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

Reply via email to