2

1 つのジェネリック パラメーターを持つ基本的な関数があります。

let func<'T> (x:'T when 'T : (static member op_Explicit: 'T -> float) ) =
   float x

エラーが発生するのはなぜですか:「宣言された型パラメーター 'T は、コンパイル時に型パラメーターを解決できないため、ここでは使用できません」

この例では、1 つのジェネリック パラメーターを指定し、明示的に float にキャストできるように制約しました。関数はすべて float にキャストするだけですが、何が問題なのでしょうか? F# のジェネリックに関連する MSDN のドキュメントをすべて読みましたが、それらはただ循環しているように見え、Visual Studio で見られる動作に対応していません。私の理解では、一重引用符構文の使用は、'Tコンパイル時のジェネリックではなく、実行時のジェネリック用です。

これは私に別の質問をもたらします。構文'Tとが^T混在しているのをよく見かけinlineます。これは、これらの構文定義に関する MSDN ドキュメントに反します。何か不足していますか?

さらに、ドキュメントから、型のop_Explicit制約は'T、型注釈なしで自動的に推論できるはずです。

let func x =
   float x

しかし、この場合、 の型は でxあると推測されますint

4

2 に答える 2

4

役立つかもしれない簡単な要約を次に示します。

inlineandメンバー制約を使用して^T、「このアドホック API セットを持つすべての型 T に対して」奇妙なコードを作成します。これは、.NET で直接作成できないコードです (たとえば、C# で記述できません)。これはinline、F# コンパイラが個々の呼び出しサイトで特定の型をインライン化/ハードコード化できるためです。これは非常に高度な機能であるため、それに関するドキュメントやサンプルが多すぎることはまずありません (また、エラー診断が必ずしも優れているとは限りません)。

'T通常のジェネリック、たとえば C# で行う通常のジェネリックに使用します。これはメインシナリオです。

どちらの場合も、多くの場合 (/より良い/より簡単に)、F# に型とジェネリック性を推測させることが可能であることに注意してください。例えば

let inline f x = float x

Visual Studio のホバー ヒントはf、適切な制約が推測されたことを示します。

于 2012-06-08T20:19:15.557 に答える
0

@ildjarn のおかげで、答えが見つかりました。

http://msdn.microsoft.com/en-us/library/dd548046から:

静的に解決された型パラメーターは、主にメンバー制約と組み合わせて使用​​ すると便利です。これは、型引数を使用するために特定のメンバーが必要であることを指定できる制約です。通常のジェネリック型パラメーターを使用して、この種の制約を作成する方法はありません。

Visual Studio では、「'T は静的に解決された型ではないため、ここではメンバー制約を使用できません」または「メンバー制約は静的に解決された型パラメーターと組み合わせてのみ使用できます。 "

于 2012-06-08T20:08:55.773 に答える