On Thu, Jul 07, 2005 at 07:08:23PM +0200, Tomasz Zielonka wrote:
Hello!
Some time ago I wanted to return the escape continuation out of the
callCC block, like this:
getCC = callCC (\c - return c)
But of course this wouldn't compile.
I thought that it would be useful to be able to keep the current
continuation and resume it later, like you can in do in scheme. Well,
it was easy to do this in Haskell in the (ContT r IO) monad, by using an
IORef. But I wasn't able to solve this for all MonadCont monads.
After more then year of on-and-off trials, I've finally managed to do
this! ;-)
import Control.Monad.Cont
getCC :: MonadCont m = m (m a)
getCC = callCC (\c - let x = c x in return x)
I was inspired by this message, and thought I could simply this further
as
getCC = callCC (\c - let x = c x in x)
After all, c can give us a MonadCont with any result type. The first
problem is that callCC is not polymorphic enough, but that is easily
fixed[1] (concerning myself just with Cont):
ccc :: ((a - (forall b. Cont r b)) - Cont r a) - Cont r a
ccc f = Cont (\k - runCont (f (\x - Cont (\_ - k x))) k)
ccc is just callCC with a more polymorphic type. But still, try as I
might, I could not get getCC to typecheck, no matter what type
annotations I used. This works:
getCC' :: Cont r (Cont r a)
getCC' = ccc (\c - let x = c x in c x)
But eg
getCC :: Cont r (Cont r a)
getCC = ccc (\(c :: Cont r a - (forall b. Cont r b)) -
let x :: forall b. Cont r b = c x in x)
gives
Couldn't match `forall b. Cont r a - Cont r b'
against `forall b. Cont r a - Cont r b'
In a lambda abstraction:
\ (c :: Cont r a - (forall b. Cont r b))
- let x :: forall b. Cont r b = c x in x
In the first argument of `ccc', namely
`(\ (c :: Cont r a - (forall b. Cont r b))
- let x :: forall b. Cont r b = ... in x)'
In the definition of `getCC'':
getCC' = ccc (\ (c :: Cont r a - (forall b. Cont r b))
- let x :: forall b. Cont r b = ... in x)
for which I have no riposte. Is this a bug? Is there any way to type
this expression? (I am using ghc 6.4.)
Andrew
[1] http://www.haskell.org/hawiki/ContinuationsDoneRight
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe