Hi friends,

When I first heard of F# a few years ago I laughed out loud, but its
popularity is exploding, and .NET pays the bills, so I am forced to take
it a little bit more seriously these days.

Tail call elimination in .NET is a *hint only* that JIT is free to
ignore in many situations [1], including:
- in debug builds,
- when calling virtual methods,
- when calling a method in a different security trust group,
- in any other case where an "implementation-specific restriction
  prevents the 'tail.' prefix from being obeyed."

Yet tail call elimination is *essential* to the correct functioning of
programs written in any functional programming language.

F# appears to eliminate tail calls to self by program transformation
where it is trivial to do so, but relies entirely on the CLR for
optimizing tail calls in general. This would mean that the stability and
reliability of programs written for the CLR in F# is uncertain, and that
debug builds of F# programs are always unreliable. I would want much
stronger guarantees about space complexity if I were to seriously
consider F# as a programming language for paid work.

So if anybody has used F# in the real world, what's the story?

[1] "Common Language Infrastructure (CLI)" 6e, ECMA-335, III.2.4

--
Thomas Koster

Reply via email to