Могу ли я определить параметр выражения цитаты таким образом, чтобы не только результирующий тип выражения проверял время компиляции , но и выражение сайта вызова.Проверка структуры котировки во время компиляции
позволяет увидеть пример:
type A = {
a : int
}
type Checker() =
static member Check(e : Expr<int>) : ResultType = ...
Следующим очевидно типа проверки
let a = { a = 1 }
Checker.Check <@ a.a @>
В результате в реальном выражении, аналогичном PropertyGet(..., PropertyGet (....), a)
.
А теперь какой-то другой способ
let getInt (a:A) : int = a.a
Следующая также компилирует
Checker.Check <@ getInt a @>
Однако, как можно предотвратить, что второй пример компилируется и разрешить только для PropertyGet
с? (как пример).
Я знаю, что могу проверить структуру выражения во время выполнения - но мне нравится иметь проверку времени компиляции.
Вы не можете. Если это критическое требование, я предлагаю использовать библиотеку комбинаторов вместо котировок. –
Как это поможет? – robkuz
Вы можете сделать свои комбинаторы (или, скорее, тип данных, которые они производят) не позволяют создавать недопустимые данные. Вы знаете, «сделать недопустимые данные нерепрезентативными» и все такое. –