1

MiniCsvTypeProvider には、次のコード行があります。

        let prop = ProvidedProperty(fieldName, fieldTy, GetterCode = fun [row] -> <@@ (%%row:float[]).[i] @@>)

GetterCode タイプは次のとおりです: Quotations.Expr list -> Quotations.Expr :

ラムダの楽しみが何をしているのかよくわかりません....

  • 入力を単一の要素配列と照合し、GetterCode シグネチャの Quotations.Expr 型の 'row' という名前の変数にバインドします。

  • 見返りにコード引用を作成します

  • コード引用内で %%row:float[] を使用していますが、これが何を意味するのかわかりません。型指定されていないコード引用に対する Float [] 型制約ですか?
4

2 に答える 2

3

ジャックの答えは正しいです。もう少しコンテキストを追加します。(%%)型なし結合演算子 (つまり、 aQuotations.Exprを別の型付きまたは型なし引用符に結合する) であり、(%)は型付き結合演算子 (つまり、 a Quotations.Expr<'t>for some'tを別の型付きまたは型なし引用符に結合する) です。 (a : ty)は単なる型注釈であるため、 が引用符に結合された(%%row : float[])場合、結果が であることを示します。この注釈がなければ、任意の型の値になる可能性があり、コンパイラはインデクサーの意味を推測できません ( inの型を推測できないのと同様)。rowfloat[]%%row.[]arrfun arr i -> arr.[i]

参考までに、 とほぼ同じことを表現する別の方法をいくつか示します<@@ (%%row:float[]).[i] @@>

  • スプライシングする前に、型なしの引用を型付きの引用に変換できます。

    let typedRow = Quotations.Expr.Cast<float[]> row 
    <@@ %typedRow.[i] @@>
    

    ここでは、型付き splice operator を使用している(%)ため、コンパイラはそれ%typedRowが afloat[]であり、.[]演算子が適用可能であることを認識します。

  • %%rowF# の型推論で注釈なしで型を判断できるように、別の方法で配列にインデックスを付けることができます。

    <@@ Array.get %%row i : float @@>
    

    ここで、Array.getメソッドは'a[]引数として を取り、結果が float であることを示す型注釈を追加するため、F# はそれ%%rowが であると推測しfloat[]ます。

于 2012-02-28T15:35:53.700 に答える
2

:float[] は明示的な型注釈です (制約ではなく、似ていますが異なります)。%%row は float[] 型の値を生成すると言っています。

F# コンパイラは、括弧内の値の型を float[] と推測するため、それを括弧で囲むと、.[idx] 構文を使用して配列の要素を取得できます。

このように型注釈を明示的に指定することは、F# コンパイラに "ヒント" を与えて型推論エラーを解決するのに便利な方法です。

于 2012-02-28T13:42:18.213 に答える