可见类型应用程序的准引用具体语法
Quasiquoter concrete syntax for visible type application
在以下代码段中,foo
、SNat @n
的第一个参数是手动组装的:
[e|foo $(appTypeE (conE 'SNat) n')|]
where
n' = litT . numTyLit . fromIntegral $ n
是否有具体的 TH quasiquoter 语法? IE。我想写一些类似
的东西
[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)))
括号。
let n = 5
n' = litT $ numTyLit $ fromIntegral n
in runQ [e| foo (SNat @($n')) |]
-- ==>
AppE (UnboundVarE foo) (AppTypeE (UnboundVarE SNat) (LitT (NumTyLit 5)))
A space 也可以,但我不会使用一个:
[e| foo (SNat @ $n') |]
在以下代码段中,foo
、SNat @n
的第一个参数是手动组装的:
[e|foo $(appTypeE (conE 'SNat) n')|]
where
n' = litT . numTyLit . fromIntegral $ n
是否有具体的 TH quasiquoter 语法? IE。我想写一些类似
的东西[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)))
括号。
let n = 5
n' = litT $ numTyLit $ fromIntegral n
in runQ [e| foo (SNat @($n')) |]
-- ==>
AppE (UnboundVarE foo) (AppTypeE (UnboundVarE SNat) (LitT (NumTyLit 5)))
A space 也可以,但我不会使用一个:
[e| foo (SNat @ $n') |]