gpt4 book ai didi

haskell - 如何在 TemplateHaskell 引用中捕获类型变量

转载 作者:行者123 更新时间:2023-12-04 15:17:18 24 4
gpt4 key购买 nike

我正在尝试编写一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com