Можно ли провести различие между типизированными и нетипизированными вложенными цитатами?
Например, учитывая <@ let x = <@ 1 @> in x @>
а также <@ let x = <@@ 1 @@> in x @>
Я могу сопоставить оба с Patterns.Let(_, (Patterns.Quote(_) as q), _) -> q
но я не могу различить типизированный и нетипизированный q
,
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"
Но я не уверен, как использовать это, чтобы различать два случая в целом. Кажется, что вы можете сделать это, только если посмотрите на контекст (а слишком много возможных контекстов...)