Квазиквотный конкретный синтаксис для приложения видимого типа

В следующем фрагменте первый аргумент 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)))

person Cactus    schedule 22.06.2019    source источник
comment
Я думаю, вам следует передать часть [e|foo|] квазицитатору, поэтому runQ [| [e|foo (SNat @$n')|] |], если я что-то не упустил?   -  person Willem Van Onsem    schedule 22.06.2019
comment
@WillemVanOnsem Я не понимаю, что ты имеешь в виду? Конечный результат моего макроса TH должен быть таким, как если бы пользователь написал foo (SNat @5) в своем коде и т. д. Вызов runQ предназначен только для проверки того, как [e| |] квазицитатор анализирует @.   -  person Cactus    schedule 22.06.2019


Ответы (1)


Круглые скобки.

let n  = 5
    n' = litT $ numTyLit $ fromIntegral n
in  runQ [e| foo (SNat @($n')) |]
-- ==>
AppE (UnboundVarE foo) (AppTypeE (UnboundVarE SNat) (LitT (NumTyLit 5)))

Пробел также работает, но я бы не стал его использовать:

[e| foo (SNat @ $n') |]
person HTNW    schedule 22.06.2019