Consequently, lifting callCC (as defined in the paper) should be a simple matter of post-composing lift. ]]>

`fmap id ≠ id`

. In particular, `fmap id ⊥ = λ _ → (⊥,⊥)`

.
]]>`StateT st (Cont r)`

is in fact the exact same monad as `ContT r (State st)`

in the context of the Monad Transformer Library. However, Mauro Jaskelioff in his paper Modular Monad Transformers argues in Section 4 that it is more natural for `callCC`

to be lifted differently in the `StateT st (Cont r)`

case, so that it differs from the instance of `callCC`

for `ContT r (State st)`

. According to Jaskelioff, the MTL’s lifting is correct in the second case, but not in the first.
The two liftings are also mentioned in Monad Transformers and Modular Interpreters in Section 8.3, which includes a few other references to where each has appeared in the literature.

]]>You should read Lazy Evaluation and Delimited Control by Garcia, Lumsdaine and Sabry. I don’t fully understand the paper yet, but I think it gives some sort of affirmative answer.

]]>