Вопрос по types – Когда отдавать предпочтение нетипизированным над напечатанными цитатами в F #?

9

F # имеет как типизированные, так и нетипизированные цитаты кода, и мне интересно, каковы случаи использования, когда один выбирает один над другим?

Является ли различие только удобством, а нетипизированные и типизированные цитаты конвертируемы в каждую во всех случаях или являются типизированными цитатами e. г. подмножество возможных с нетипизированными цитатами?

Существуют ли примеры, которые работают только с типизированными, но не с нетипизированными цитатами & # x2013; или наоборот?

Ваш Ответ

2   ответа
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<_> вExpr перейти от типизированного к нетипизированному; использоватьExpr.Cast идти другим путем).

3

Потребителей библиотек обработки цитат будут использовать типизированные цитаты. Принимая во внимание, что обработка цитатыавтор нужно работать с нетипизированными цитатами.

То есть вы часто не будете напрямую создавать нетипизированные цитаты, используя(<@@ @@>) оператор. Но, чтобы рекурсивно обработать цитату, используя различные активные шаблоны базовой библиотеки F #, такие как Quotations.Patterns модуль, вы работаете с цитатами в их нетипизированной форме.

Обратите внимание, чтоExpr<'T> расширяетExpr и на самом деле не добавляет много информации. То есть типизированные цитаты на самом деле просто иллюзия, все захваченные метаданные находятся вExpr объект и доступен только во время выполнения.

Похожие вопросы