Malé doplnění k tail rekurzi. V F# záleží na IL instrukcích. Například následujícímu programu dojde zásobník, i když z pohledu programátora to vypadá, že f i bar jsou volány v tail pozici:
let bar (f : int -> unit) (i : int) : unit =
if i >= 0
then f (i - 1)
else printfn "Stop"
let rec foo (i : int) : unit =
bar foo i
[<EntryPoint>]
let main args =
foo 1000_000
0
U bar to je i pravda, u f nikoliv, protože po volání f musí kompilátor ještě převést unit na void. Řešením je nepoužívat unit, ale udělat si vlastní type MyUnit = MyUnit
Ano, to by šlo, ale nikdo to zatím do jazyka nepřidal. Viz https://github.com/fsharp/fslang-suggestions/issues/721