В следующем фрагменте первый аргумент foo
, SNat @n
, собирается вручную:
[e|foo $(appTypeE (conE 'SNat) n')|]
where
n' = litT . numTyLit . fromIntegral $ n
Есть ли для этого конкретный синтаксис квазицитирования TH? т.е. Я хотел бы написать что-то вроде
[e|foo (SNat @$n')|]
но это, по-видимому, анализируется так, как будто я применяю инфиксный оператор ($@)
:
> runQ [e|foo (SNat @$n')|]
AppE (VarE foo) (InfixE (Just (ConE SNat)) (UnboundVarE @$) (Just (VarE n')))
Интересно, что квазикавычки [e| |]
, по-видимому, поддерживают конкретный синтаксис для приложений неквазивидимого типа:
> runQ [e|foo (SNat @5)|]
AppE (VarE foo) (AppTypeE (ConE SNat) (LitT (NumTyLit 5)))
[e|foo|]
квазицитатору, поэтомуrunQ [| [e|foo (SNat @$n')|] |]
, если я что-то не упустил? - person Willem Van Onsem   schedule 22.06.2019foo (SNat @5)
в своем коде и т. д. ВызовrunQ
предназначен только для проверки того, как[e| |]
квазицитатор анализирует@
. - person Cactus   schedule 22.06.2019