1. ホーム
  2. f#

F#における `inline` の使用

2023-12-03 08:59:25

質問

その inline 例えば、関数の型に影響を与えるようです("静的に解決された型パラメータとは何ですか"?F#の型はすべて静的に解決されないのでしょうか?)

いつ inline 関数を使うべきでしょうか?

どのように解決するのですか?

この inline キーワードは、関数定義がそれを使用するコードにインラインで挿入される必要があることを示します。 ほとんどの場合、これは関数の型に何の影響も与えません。 しかし、まれに、より一般的な型を持つ関数になることがあります。これは、.NET のコードのコンパイル形式では表現できないが、関数がインライン化されるときに強制できる制約があるためです。

これが適用される主なケースは、演算子の使用です。

let add a b = a + b

は単相の推論された型(おそらく int -> int -> int のようなものである可能性があります。 float -> float -> float のようになる可能性もあります.) しかし、この関数をインラインでマークすることにより、F#コンパイラは多相型を推測します。

let inline add a b = a + b
// add has type ^a ->  ^b ->  ^c when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

この型制約を.NET上のコンパイルされたコードで第一級の方法でエンコードする方法はありません。 しかし、F#コンパイラは関数をインライン化するサイトでこの制約を強制することができるので、すべての演算子の使用はコンパイル時に解決されます。

型パラメータ ^a , ^b そして ^c は"静的解決型パラメータ"であり、これは引数の型がこれらのパラメータが使用されているサイトにおいて静的に知られていなければならないことを意味します。 これは、通常の型パラメータ(例えば 'a , 'b など)、パラメータは「quot;後で提供されるが、何でも可能ないくつかのタイプ」のような意味です。