F# 是否强制转换非类型代码引用?

F# 是否强制转换非类型代码引用?,f#,quotations,type-providers,F#,Quotations,Type Providers,在MiniCsvTypeProvider中,我看到以下代码行: let prop = ProvidedProperty(fieldName, fieldTy, GetterCode = fun [row] -> <@@ (%%row:float[]).[i] @@>) GetterCode类型为:quotes.Expr list->quotes.Expr: 我真的不知道lambda fun在做什么 它将其输入与单个元素数组相匹配,将其绑定到一个名为“row”的

在MiniCsvTypeProvider中,我看到以下代码行:

        let prop = ProvidedProperty(fieldName, fieldTy, GetterCode = fun [row] -> <@@ (%%row:float[]).[i] @@>)
GetterCode类型为:quotes.Expr list->quotes.Expr:

我真的不知道lambda fun在做什么

它将其输入与单个元素数组相匹配,将其绑定到一个名为“row”的变量,该变量的类型为GetterCode签名中的quotes.Expr

它会创建一个代码引号作为回报

在代码引用中,它使用%%row:float[],我不知道这意味着什么:这是非类型化代码引用的float[]类型约束吗?
:float[]是一个显式类型的注释not约束,类似但不同;它表示%%row将生成float[]类型的值

然后,通过将其包装在括号中,您可以使用[idx]语法获取数组的元素,因为F编译器将括号中的值的类型推断为float[]


以这种方式显式指定类型注释是给F编译器一个提示并解决类型推断错误的有用方法。

float[]是一个显式类型注释not约束,类似但不同;它表示%%row将生成float[]类型的值

然后,通过将其包装在括号中,您可以使用[idx]语法获取数组的元素,因为F编译器将括号中的值的类型推断为float[]


通过这种方式显式指定类型注释可以为F编译器提供提示并解决类型推断错误。

Jack的答案是正确的。我将添加更多的上下文。%%是非类型化拼接运算符,即将引号.Expr拼接到另一个类型化或非类型化引号中,而%是类型化拼接运算符,即拼接引号。ExprJack的答案是正确的。我将添加更多的上下文。%%是非类型化拼接运算符,即将引号.Expr拼接到另一个类型化或非类型化引号中,而%是类型化拼接运算符,即拼接引号.Exprsort of。在msdn中:您使用%%运算符将非类型表达式对象插入到非类型引号中。我看到了这一点,但更让我困惑的是:float[]部分。编辑了这个问题,使之更清楚。在msdn中:您使用%%运算符将非类型表达式对象插入到非类型引号中。我看到了这一点,但更让我困惑的是:float[]部分。编辑了这个问题以使它更清楚。我被新的代码引用语法弄糊涂了。谢谢你,真的。我被新的代码引用语法弄糊涂了。谢谢。谢谢你的清楚解释。代码引用似乎给你留下了一些让你大吃一惊的余地。不幸的是,在所考虑的prog中,表达式经过一个特定的“评估者”,其能力是有限的。例如,这样做不起作用,:ProvidedPropertyfieldName,fieldTy,GetterCode=fun[row]->感谢您的明确解释。代码引用似乎给你留下了一些让你大吃一惊的余地。不幸的是,在所考虑的prog中,表达式经过一个特定的“评估者”,其能力是有限的。例如,这样做不起作用,:ProvidedPropertyfieldName,fieldTy,GetterCode=fun[row]->
let typedRow = Quotations.Expr.Cast<float[]> row 
<@@ %typedRow.[i] @@>
<@@ Array.get %%row i : float @@>