+ 1 Definition

This is an eager variant of the fixpoint combinator:

  fun fix[T] (f:(T->T)->T->T) (x:T) : T => f (fix f) x;

To use this combinator we need to define a function with open recursion first:

  fun factabs (fact:int->int) (x:int) : int =>
    match x with
    | 0 => 1
    | x => x * fact (x - 1)

This function is a flat function which accepts an arbitrary function of type int->int as an argument. It is intended to accept its own body as an argument. So next we have to close the recursive knot with the fixpoint combinator:

  var fact = fix factabs;

We can check this is indeed the factorial function with a sample application:

  println$ fact 5;