インライン関数 (F#)
インライン関数とは、呼び出し元のコードに直接統合される関数です。
インライン関数の使用
静的な型パラメーターを使用する場合は、型パラメーターによってパラメーター化されるすべての関数をインライン化する必要があります。 これにより、コンパイラがそれらの型パラメーターを解決できることが保証されます。 通常のジェネリック型パラメーターを使用する場合には、このような制約はありません。
インライン関数を使用すると、メンバー制約を使用できるだけでなく、コードを最適化することもできます。 ただし、インライン関数を必要以上に使用すると、コンパイラの最適化での変更およびライブラリ関数の実装において、コードが脆弱になるおそれがあります。 そのため、他に使用可能な最適化手法が見つからない限り、インライン関数を使用した最適化は避けてください。 関数やメソッドをインライン化すると、パフォーマンスが向上する場合もありますが、必ず向上するとは限りません。 したがって、パフォーマンス測定を使用して、特定の関数のインライン化によって実際にパフォーマンスが向上するかどうかを確認することも必要です。
inline 修飾子は、最上位の関数、モジュール レベルの関数、またはクラスのメソッド レベルの関数に適用できます。
最上位のインライン関数、インラインのインスタンス メソッド、およびインラインの静的メソッドを次のコード例に示します。
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
インライン関数と型の推論
inline がある場合は、型の推論に影響します。 これは、インライン関数では静的に解決される型パラメーターを使用できるためです。これに対し、インライン関数以外では、このような型パラメーターを使用できません。 静的に解決される型パラメーターを持つ関数で float 変換演算子を使用しているために inline が役立つケースを、次のコード例に示します。
let inline printAsFloatingPoint number =
printfn "%f" (float number)
inline 修飾子がない場合は、型の推論によって指定の型が関数に適用されます。この場合は int です。 inline 修飾子がある場合は、関数が、静的に解決される型パラメーターを持つことも推論されます。 inline 修飾子を使用すると、型は次のように推論されます。
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
このため、関数では、float への変換をサポートする任意の型を使用できます。