9

F#には型付きコードと型付きコードの両方の引用符がありますが、どちらかを選択するユースケースは何ですか?F#でタイプされていない型の引用符を好むのはいつですか?

区別は便宜的で、型なし引用符はすべての場合にそれぞれに変換可能であるか、引用符で入力されますe。 g。タイプのない見積もりで可能なサブセット?

型付きでのみ動作する例がありますが、型なしの引用では動作しません。

答えて

7

一般的に、可能な場合は常に型付き引用符を使用することをおすすめします。いつものように、このタイプでは、実行時に障害を引き起こすかもしれないいくつかの正確さ条件を静的に強制することができます。考えてみましょう:

let one = <@@ "one" @@> 
// exception at runtime 
let two = <@@ 1 + %%one @@> 

さらに

let one = <@ "one" @> 
// compile time error: the type 'string' does not match the type 'int' 
let two = <@ 1 + %one @> 

は対照的に、時には型なしの引用が入力された見積書がない場合には、追加型注釈が必要になります。しかし

// ok 
let l = <@ [1] @> 
let l2 = <@ List.map id %l @> 

// fails at runtime (obj list assumed instead of int list) 
let l = <@@ [1] @@> 
let l2 = <@@ List.map id %%l @@> 

// ok 
let l = <@@ [1] @@> 
let l2 = <@@ List.map (id:int->int) %%l @@> 

、あなたがしている場合クォーテーションから非常に一般的なものを構築すると、型付き引用符を使用することができない場合があります(たとえば、型が静的に知られていないためです)。その意味で、タイプのない見積もりは、より柔軟性を提供します。

はまた、必要に応じて(;他の道を行くためにExpr.Castを使用して型なしに入力されたから行くためにExprExpr<_>をアップキャスト)型付きと型なしの引用の間で変換することは非常に簡単だということに注意してください。

3

一般に、の消費者の引用処理ライブラリでは、型付き引用符が使用されます。引用処理の作成者は、型指定のない見積もりで作業する必要があります。

つまり、(<@@ @@>)演算子を使用して、型指定されていない見積もりを直接作成することはありません。しかし、Quotations.Patternsモジュールのような様々なF#コアライブラリのアクティブパターンを使って再帰的に見積もりを処理するには、型なしの見積もりで作業します。

Expr<'T>Exprに拡張され、実際にはそれに多くの情報を追加しないことに注意してください。つまり、型付き引用はまさに錯覚であり、キャプチャされたメタデータはすべてExprオブジェクトにあり、実行時にのみ利用可能です。

関連する問題