1

在以下代码段中, , 的第一个参数fooSNat @n手动组装的:

[e|foo $(appTypeE (conE 'SNat) n')|]
  where
    n' = litT . numTyLit . fromIntegral $ n

是否有具体的 TH quasiquoter 语法?即我想写类似的东西

[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)))
4

1 回答 1

2

括号。

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') |]
于 2019-06-22T13:54:34.133 回答