作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 Lift 实例,它不仅可以提升构造函数,还可以提升其类型变量。例如,以 Proxy a
为例。我需要一个 Lift
实例,这样当拼接 lift (Proxy @Int)
时,GHC 将正确推断生成的表达式是一个 Proxy Int
.
-- GHC should infer that x :: Proxy Int
x = $(TH.lift (Proxy @Int))
我试过这个:
instance Lift (Proxy a) where
lift _ = [|Proxy @a|]
x = $(TH.lift (Proxy @Int))
似乎 TH 捕获了 a
而不是预期的 Int
。我不确定还能尝试什么
/.../TH/Test.hs:15:7: error:
• The exact Name ‘a’ is not in scope
Probable cause: you used a unique Template Haskell name (NameU),
perhaps via newName, but did not bind it
If that's it, then -ddump-splices might be useful
最佳答案
template-haskell 似乎没有提供类似的东西。但是可能有一个解决方案可以让您从头开始实现。这个想法是定义一个类来携带代表每种类型的引号:
class TLift a where
tlift :: Q Type
例如:
instance TLift Int where
tlift = [t|Int|]
-- and so on
然后定义一个具有类型应用程序的报价:
proxyQ :: forall a. TLift a => Q Exp
proxyQ = [|Proxy @( $(tlift @a) )|]
这里的一个限制是 TLift
实例只能为完全具体的类型生成引号,不能为类型变量生成引号。也许reflection可以解决这个问题。
关于haskell - 如何在 TemplateHaskell 引用中捕获类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64101825/
我是一名优秀的程序员,十分优秀!