Funzioni inline (F#)
Le funzioni inline sono funzioni integrate direttamente nel codice chiamante.
Utilizzo di funzioni inline
Se si utilizzano parametri di tipo statici, qualsiasi funzione parametrizzata dai parametri di tipo deve essere inline. In questo modo viene garantito che il compilatore possa risolvere questi parametri di tipo. Se si utilizzano parametri di tipo generico comuni, non vi sono restrizioni.
Oltre che per consentire l'utilizzo di vincoli di membro, le funzioni inline possono risultare utili per l'ottimizzazione del codice. L'abuso di funzioni inline può tuttavia rendere il codice meno resistente alle modifiche apportate alle ottimizzazioni del compilatore e all'implementazione delle funzioni della libreria. Per questo motivo, è consigliabile evitare di utilizzare funzioni inline per l'ottimizzazione, a meno che non siano già state provate tutte le altre tecniche di ottimizzazione. L'impostazione di una funzione o di un metodo come inline consente talvolta di migliorare le prestazioni, ma non è sempre così. È pertanto consigliabile utilizzare anche indicatori di prestazioni per verificare i vantaggi effettivi derivanti dall'esecuzione di una funzione inline.
È possibile applicare il modificatore inline alle funzioni di primo livello, a livello di modulo o a livello di metodo in una classe.
Nell'esempio di codice seguente viene illustrata una funzione inline di primo livello, un metodo di istanza inline e un metodo statico inline.
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
Funzioni inline e inferenza del tipo
La presenza di inline influisce sull'inferenza del tipo, in quanto le funzioni inline possono presentare parametri di tipo risolti in modo statico, a differenza delle funzioni non inline. Nell'esempio di codice seguente viene mostrato un caso in cui inline risulta utile, poiché si utilizza una funzione che presenta un parametro di tipo risolto in modo statico, l'operatore di conversione float.
let inline printAsFloatingPoint number =
printfn "%f" (float number)
Senza il modificatore inline, l'inferenza del tipo fa in modo che la funzione utilizzi un tipo specifico, in questo caso int. Con il modificatore inline si deduce tuttavia che la funzione presenti un parametro di tipo risolto in modo statico. Con il modificatore inline si deduce che il tipo sia il seguente:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
La funzione accetta quindi qualsiasi tipo che supporti una conversione a float.