Приведение цитаты нетипизированного кода? - PullRequest
1 голос
/ 28 февраля 2012

В MiniCsvTypeProvider я вижу следующую строку кода:

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

с типом GetterCode: Список котировок. Экспресс -> Котировки. Экспресс :

Я действительно не знаю, что делает лямбда fun ....

  • он сопоставляет свой вход с одним массивом элементов, связывая его с переменнойс именем 'row', типа Quotations.Expr из подписи GetterCode.

  • она создает кодовую цитату взамен

  • внутри цитаты кода и использует%% row: float [] и я не знаю, что это значит: это ограничение типа Float [] для нетипизированных цитат кода?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Джек ответ правильный. Я добавлю немного больше контекста. (%%) - это оператор нетипизированного соединения (то есть он вставляет Quotations.Expr в другую типизированную или нетипизированную цитату), в то время как (%) - это типизированный оператор соединения (то есть, он склеивает Quotations.Expr<'t> для некоторого 't в другую типизированную или нетипизированную цитату). (a : ty) - это просто аннотация типа, поэтому (%%row : float[]) указывает, что когда row вставляется в цитату, результатом является float[]. Без этой аннотации %%row может быть значением любого типа, и компилятор не сможет определить, что мы имеем в виду под индексатором .[] (так же, как он не может определить тип arr в fun arr i -> arr.[i]. ).

Если это полезно, вот несколько альтернативных способов выразить примерно то же самое, что и <@@ (%%row:float[]).[i] @@>:

  • Мы можем преобразовать нетипизированную цитату в типизированную цитату до сращивания:

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

    Здесь мы используем типизированный оператор сращивания (%), поэтому компилятор знает, что %typedRow - это float[] и что применим оператор .[].

  • Мы можем использовать другой способ индексации в массиве, чтобы вывод типа F # мог определять тип %%row без аннотации:

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

    Здесь метод Array.get принимает 'a[] в качестве аргумента, и мы добавляем аннотацию типа, которая указывает, что результатом является float, поэтому F # выведет, что %%row является float[].

2 голосов
/ 28 февраля 2012

: float [] - это явная аннотация типа (не ограничение, которое похоже, но отличается); он говорит, что %% row выдаст значение типа float [].

Затем, заключив его в скобки, вы можете использовать синтаксис. [Idx], чтобы получить элемент массива, поскольку компилятор F # выводит тип значения в скобках как float [].

Явное указание аннотации типа таким способом может быть полезным для подсказки компилятору F # и устранения ошибок вывода типа.

...