Квазиквотерный конкретный синтаксис для приложения видимого типа - PullRequest
1 голос
/ 22 июня 2019

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

1 Ответ

2 голосов
/ 22 июня 2019

Скобки.

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') |]
...