Я думаю, что короткий ответ заключается в том, что магическая функция должна работать, так как кавычки действительно фиксируют свои локальные переменные (в некотором смысле).По сути, локальные переменные времени компиляции в квадратных скобках заменяются их литеральными значениями и становятся константами времени выполнения.Это достигается путем неявного вызова функции lift, так что [|.. var .. |] становится [|$ (lift var) |].
Возможно, вы путаете это поведение с тем, что они однозначно захватывают локальные переменные, так что повторные вызовы одной и той же цитаты не будут мешать именам переменных друг друга.Это достигается за счет вызовов newName за кулисами, что обеспечивает уникальные имена переменных.
Если это поможет, я лично думаю о кавычках как о «генераторах сплайсинга» - маленьких фрагментах кода на Haskell, которые будут преобразованыв AST во время компиляции и, следовательно, станут соединениями, готовыми для вставки куда угодно.Как указывалось в руководствах Булата ( ссылки из ), они действуют как форма препроцессора макросов, так как они представляют собой смеси функций Haskell, генерирующих код, и простого автоматического преобразования кода haskell в TH AST.
Редактировать: Кажется, я побил меня ответом - я оставляю свой ответ, если он дает какую-то дополнительную ценность.