[Haskell-cafe] How to understand the 'forall' ?

Ryan Ingram ryani.spam at gmail.com
Wed Sep 2 01:17:20 EDT 2009

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

More information about the Haskell-Cafe mailing list