[Haskell-cafe] Problem with continuations and typing

tpledger at ihug.co.nz tpledger at ihug.co.nz
Sun Dec 4 16:34:36 EST 2005


Jerzy Karczmarczuk wrote:
 :
 | zeros fc sc = sc 0 zeros
 |
 | fails to compile as well. *I do not ask why, I know*.
 |
 | But I would like to continue this exercice along these
lines, without too much
 | exotism (no monads, yet...), for my students. Do you have
any simple work-around?
 | Introduce some algebraic constructors? Perhaps
higher-rank polymorphism could do
 | something (but then I would have to explain it to my
folk...)
 :


How about this for a non-exotic algebraic type?

> newtype G a b = G{ unG :: b -> (a -> G a b -> b) -> b }
> glist g       = unG g [] (\b g' -> b : glist g')
> zeros         = G (\no yes -> yes 0 zeros)
> disj  g1 g2   = G (\no yes -> unG g1 (unG g2 no yes)
>                                      (\b g1' -> yes b
(disj g1' g2)))

I haven't had much practice with continuations, so don't
know whether I've just lost some generality there.

But it does support *some* avoidance of higher-rank
polymorphism, through the use of good old partial
application.  For example, the type of the state variable s
doesn't leak into the result type of unfold:

> unfold f s    = G (\no yes -> case f s of
>                     Nothing      -> no
>                     Just (s', b) -> yes b (unfold f
s'))

HTH,
Tom


More information about the Haskell-Cafe mailing list