The function fix should take as argument a function f' and return a function f so that f x is equal to ff x. The solution is to store f in a reference r. We temporarily create the reference r with a dummy function (that is not meant to be used). Assuming that the reference will later contain the correct version of f, we can define f as fun x -> f' !r x. Hence, the following solution:
let fix f' = let r = ref (fun _ -> raise (Failure "fix")) in let f x = f' !r x in r := f; !r;;
val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
Note that the exception should never be raised because the content of the reference is overridden by f before being reference is used.

We could also use the option type to initialized the content of the reference to None and replace it later with Some f. However, would not avoid raising an exception if the value of the reference where to be None when being read, even though this situation should never occur dynamically in a correct implementation.

As an example, we define the factorial function:

let fact' fact n = if n > 0 then n * fact (n-1) else 1 in fix fact' 6;;
- : int = 720