用于可见类型应用的准Quasiquoter混凝土语法



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

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

是否有混凝土的准则语法?IE。我想写

之类的东西
[e|foo (SNat @$n')|]

,但这似乎是在解析,好像我正在应用infix操作员($@)

> runQ [e|foo (SNat @$n')|]
AppE (VarE foo) (InfixE (Just (ConE SNat)) (UnboundVarE @$) (Just (VarE n')))

有趣的是, [e| |] quasi quoter似乎确实支持非QuaSi可见类型应用程序的具体语法:

> runQ [e|foo (SNat @5)|]
AppE (VarE foo) (AppTypeE (ConE SNat) (LitT (NumTyLit 5)))

括号。

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

相关内容

  • 没有找到相关文章

最新更新