如何替换 `[p| 中的 `zs` zs@(z:_) |]` 我自己起的名字?

How to replace `zs` in `[p| zs@(z:_) |]` with a name I generate myself?

如果我运行:

> runQ [p| zs@(z:_) |]
AsP zs_46 (InfixP (VarP z_47) GHC.Types.: WildP)

我想用我自己生成的名称替换 zsz。我可以替换 z:

> let z = mkName "z"
> runQ [p| zs@($(varP z):_) |]
AsP zs_48 (InfixP (VarP z) GHC.Types.: WildP)

但我不知道如何替换 zs。有没有办法在引号内做到这一点,或者我必须求助于 asP,等等......?

你可能做不到。拼接仅适用于模式、表达式、声明和类型。这不是其中任何一个,因为它只是一个名称。

同样不能用模板拼接其他地方的名字Haskell

[d| $(mkName "f") x = x |] -- invalid

使用您提到的 asP 最接近的是

asP (mkName "zs") [p| z:_ |]