Lambda the Ultimate

inactiveTopic Continuations (and call/cc) in Haskell
started 1/3/2004; 4:03:49 AM - last post 1/5/2004; 5:25:30 PM
Ehud Lamm - Continuations (and call/cc) in Haskell  blueArrow
1/3/2004; 4:03:49 AM (reads: 10088, responses: 4)
Continuations (and call/cc) in Haskell
Why does Haskell have no continuations? ... If continuations are incompatible with non-strict semantics, I'd appreciate an explanation.

A nice thread on the Haskell mailing list.


Posted to functional by Ehud Lamm on 1/3/04; 4:04:15 AM

Carlos Scheidegger - Re: Continuations (and call/cc) in Haskell  blueArrow
1/3/2004; 7:37:50 AM (reads: 611, responses: 0)
(Minor english edits)

Similar discussion on LtU not long ago. The same FPCA'95 paper by Gunther, Riecke and Remy is cited.

In the Haskell thread, there have been some examples of bad interactions between RT and call/cc, but is there any published theoretical result concerning this? I'd like to read them.

A more general, but related question: I've seen some proofs that go "control operator X can be implemented in terms of control operator Y", but I don't recall seeing any proofs that go "X cannot be implemented in terms of Y". Are there any published results of those?

This would imply a partial order on the control operators, and we'd have a firmer notion of expressiveness of them. The problem seems to be how to mix and match these control operators with the presence of state and higher-order syntax.

Neel Krishnaswami - Re: Continuations (and call/cc) in Haskell  blueArrow
1/3/2004; 7:51:38 AM (reads: 608, responses: 0)
Take a look at Andrzej Filinski's PhD thesis, Controlling Effects -- in it, he shows how any monadic effect can be described in terms of call/cc and a reference cell.

So if you want to find control operators that can't be expressed in terms of call/cc and a reference, then you need to find one that can't be given a monadic formulation; possibly some versions of the stack-inspection primitives in aspect-oriented programming would qualify.

Oleg - Re: Continuations (and call/cc) in Haskell  blueArrow
1/5/2004; 3:29:36 PM (reads: 340, responses: 0)
Carlos Scheidegger wrote:
I've seen some proofs that go "control operator X can be implemented in terms of control operator Y", but I don't recall seeing any proofs that go "X cannot be implemented in terms of Y". Are there any published results of those?

Yes, of course. The original shift/reset paper "Abstracting Control" by Danvy and Filinski implies a number of such inexpressibility results.

For example, call/cc in a language without mutations cannot express shift/reset [see citeseer.nj.nec.com/felleisen90expressive.html for the definition of 'express' used here].

The reason for that is simple: CPS of an applicative mutation-free program with call/cc is a tail-call program. OTH, CPS of an applicative program with shift/reset generally includes non-tail calls.

An applicative program with shift/reset requires two CPS transformations to bring it into a tail-call form. It is known (see the messages on the Haskell list thread that started this discussion) that call/cc alone cannot emulate mutation. Therefore, if we have a program with mutations and call/cc, we need one CPS-like transformation to explicitly thread the state (and thus convert a program with mutations into a purely applicative form), and another CPS transformation to eliminate call/cc. If we call a tail-index of a program the number of CPS transformations needed to turn it into a tail-call form, then

  • an applicative tail-call program has the index of 0
  • a general applicative program with or without call/cc has the index of 1
  • a program with assignments and call/cc has the index of 2
  • an applicative shift/reset program has the index of 2, in general.
Higher-order shift/reset introduced in the Danvy/Filinski paper have larger indices. Thus a higher-order shift/reset is inexpressible with lower-order shift/resets.

Carlos Scheidegger - Re: Continuations (and call/cc) in Haskell  blueArrow
1/5/2004; 5:25:30 PM (reads: 326, responses: 0)
Thank you so much, Oleg and Neel, for the great pointers. This was exactly what I was looking for.

So many nice PLT readings, so little time!