# Type of callcc

The monad of continuations defines

*M*α = (α →*Answer*) →*Answer*

and with this definition of *M*, I said that *callcc* has type

*callcc*:: ((α →*M*β) →*M*α) →*M*α

So expanding the definition of *M*, that becomes

*callcc*:: ((α → (β →*Answer*) →*Answer*) → (α →*Answer*) →*Answer*) → (α →*Answer*) →*Answer*

Its definition is

*callcc**g**k*=*g**h**k**where**h**x**k'*=*k**x*

This function therefore does have the desirable property that its type is longer than its definition. To check that the type follows from the definition, we should first observe that (for fixed α and β), *g* and *k* have the types

*g*:: (α → (β →*Answer*) →*Answer*) → (α →*Answer*) →*Answer**k*:: α →*Answer*

So the local function *h* has the type α → γ → *Answer* for any type γ, because it ignores its argument *k'*. In particular, we can give it the type

*h*:: α → (β →*Answer*) →*Answer*.

Thus *g* *h* has type (α → *Answer*) → *Answer*, and *g* *h* *k* has type *Answer* as required.