As pointed out in the other answers and comments, f-expansion is implemented using \romannumeral which was sometimes needed in expansion contexts before the \expanded primitive was available. This answer also mentions two use cases where it might still be of use, namely expansion without a known end point and lookaheads of the next unexpandable token.
Additionally, I'd like to point out a common use case where it's even wrong to use, as it gives undesired results. This is based on the fact that, while x-expansion continues fully expanding tokens beyond the first unexpanable token, f-expansion is more eager in the case \exp_not:n is used in the token stream.
If we look at the following examples, we see that expansion is the same when \exp:not:N (\noexpand) is used:
\cs_set:Npn \foo { [FOO] }
\tl_set:Nx \l_tmpb_tl { \exp_not:N \foo bar }
\tl_show:N \l_tmpb_tl
\tl_set:Nf \l_tmpb_tl { \exp_not:N \foo bar }
\tl_show:N \l_tmpb_tl
outputs
> \l_tmpb_tl=\foo bar.
> \l_tmpb_tl=\foo bar.
On the other hand, using \exp_not:n (\unexpanded) gives different results:
\tl_set:Nx \l_tmpb_tl { \exp_not:n { \foo } bar }
\tl_show:N \l_tmpb_tl
\tl_set:Nf \l_tmpb_tl { \exp_not:n { \foo } bar }
\tl_show:N \l_tmpb_tl
outputs
> \l_tmpb_tl=\foo bar.
> \l_tmpb_tl=[FOO]bar.
This is especially important when dealing with parts of the contents of token list variables via the \tl_head:, \tl_tail:, \tl_range: etc. functions. All those wrap their result in \exp_not:n. f-expansion may seem appropriate here, but it's actually not:
\tl_set:Nn \l_tmpa_tl { \foo bar }
\tl_set:Nx \l_tmpb_tl { \tl_head:V \l_tmpa_tl }
\tl_show:N \l_tmpb_tl
\tl_set:Nf \l_tmpb_tl { \tl_head:V \l_tmpa_tl }
\tl_show:N \l_tmpb_tl
outputs
> \l_tmpb_tl=\foo .
> \l_tmpb_tl=[FOO].
As pointed out by Phelype Oleinik, protected macros behave differently as well:
\cs_new_protected:Npn \protected_foo { \foo }
\tl_set:Nx \l_tmpb_tl { \protected_foo bar }
\tl_show:N \l_tmpb_tl
\tl_set:Nf \l_tmpb_tl { \protected_foo bar }
\tl_show:N \l_tmpb_tl
outputs
> \l_tmpb_tl=\protected_foo bar.
> \l_tmpb_tl=[FOO]bar.
f-type expansion ends with the first-encountered unexpandable token. If this token is a space, it is gobbled. You wante-type expansion, I guess. – egreg Jun 05 '19 at 09:12finstead ofxoreexpansion? – AlexG Jun 05 '19 at 09:15\romannumeralwithenow available it is possibly less useful than it was, but advantage overxthat it can be used in expansion contexts – David Carlisle Jun 05 '19 at 10:13