You can also nest wrap your functions and create two higher-order-functions that take a function as an argument and apply it.
This could than be sth. like:
let fn2 fn =
if "something happend" then
fn fn2
let rec fn1 fn =
if "something" then
fn fn1
You can call than call your function like this:
let result = fn1 fn2
If you want your function to be more explicit your can write it for example like:
let rec fn2 (fn:unit->unit) : unit =
if "something happend" then
fn fn2
let rec fn1 (fn:unit->unit) : unit =
if "something" then
fn fn1
But I think kvb's answer is they better way to go because it is more standard-conform and readable.