Можно ли провести различие между типизированными и нетипизированными вложенными цитатами?

Например, учитывая <@ 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"

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

Другие вопросы по тегам