Можно ли различать типизированные и нетипизированные вложенные цитаты?

Например, учитывая <@ let x = <@ 1 @> in x @> и <@ let x = <@@ 1 @@> in x @>, я могу сопоставить оба с Patterns.Let(_, (Patterns.Quote(_) as q), _) -> q, но я не могу различить типизированный и нетипизированный q.


person Stephen Swensen    schedule 04.07.2011    source источник


Ответы (1)


Интересно. Создается впечатление, что цитаты всегда хранятся в типизированном виде.

Тип подвыражения <@@ 1 @@> внутри цитаты всегда Expr<int>. Однако тип переменной x различается в ваших двух цитатах:

match q1 with
| Patterns.Let(v, (Patterns.Quote(_) as q), _) when v.Type = typeof<Expr> -> "untyped"
| Patterns.Let(_, (Patterns.Quote(_) as q), _) -> "typed"
| _ -> "other"

Но я не уверен, как использовать это, чтобы различать два случая в целом. Кажется, что вы можете сделать это, только если посмотрите на контекст (а возможных контекстов слишком много...)

person Tomas Petricek    schedule 04.07.2011
comment
Верно, и, кроме того, хотя Type любой вложенной цитаты всегда является общим, фактический тип всегда не является общим. - person Stephen Swensen; 04.07.2011