【发布时间】:2020-09-29 04:37:35
【问题描述】:
我正在尝试编写一个 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
【问题讨论】:
-
我之前的评论有误。引号使用
Lift表示特定类型的变量,而不是文字构造函数。基本模式很好。 -
生成类型应用程序真的很重要吗?我认为不可能使用未知类型进行这项工作。似乎您遇到了在生成拼接时外部类型变量不再存在的问题,因此没有什么可以引用的。有一些解决方法,但它们需要在
Lift类中放弃。 -
啊,如果你放弃类型应用程序,
Lift类可以工作。 -
不需要使用类型应用程序。这是一个更接近我的实际用例的重现:gist.github.com/dcastro/20175fdbf2e43a77c9504d98e9fa3c36