Let me just show how to define a recursive function just by using exceptions. This is rather interesting because here we are not using in any sense any recursive programme. Here we are showing that in fact the non-functional feature of exceptions is powerful enough to be able to define non-terminating functions, to be able to define general recursion. What do we do? Well, essentially we simulate the recursive abstract data type that we had in the previous slide with this new type: unit arrow unit. Of course this is just a conventional type. All the action goes on precisely in the raising of an exception. This time we implement roll and unroll independently and as you see what does roll do? Well, it takes a function of this form and packages it not as a function of AB l as in the previous example but as an object of unit arrow unit. So where has the function F gone? Well, it has been raised as an exception. If unroll, as is the case here, is capable of capturing this exception and handling it, you see this is an exception with a parameter, and handling it by producing back, by returning back the original function, here we have implemented unroll. This time if we use roll and unroll as we did in the previous example here we will be again be able to type the fixed-point combinator Y and to use it safely as a fixed-point combinator for defining yet in another way the safe factorial function. The type of the functor of Y as you see will be still the same. All the action here is hidden in this roll and unroll.