【问题标题】:Is it possible to get a type of any expression using Template Haskell?是否可以使用 Template Haskell 获得任何类型的表达式?
【发布时间】:2023-03-26 13:01:02
【问题描述】:

给定一个表达式foo,我可以声明一个顶级函数

bar = foo

并通过reifying bar 获取foo 的类型为Type

case reify 'bar of
  VarI _ t _ _ -> t

有没有直接获取foo 类型的方法,而不创建bar 的冗余定义?理想情况下,作为 Exp -> Q Type 类型的函数。

【问题讨论】:

  • 为什么直接reify 'foo 不适合你?
  • @NikitaVolkov foo这里只是代表一个表达式,比如1 + 2 + 3,不是名字。
  • 哦。好吧,既然reify 是 TH 的唯一具体化函数,而且它只接受名字,我猜你已经很受约束了。

标签: haskell types expression template-haskell reify


【解决方案1】:

您要的是Exp -> Q InfoExp -> Q Type 之类的函数,是吗? TH 不提供这样的功能。产生Info 的唯一 TH 函数是 reify,似乎没有其他 TH 类型会公开您所追求的类型信息。目前的 TH API 似乎没有提供具体化任意表达式的方法。

我不是 GHC 内部的专家,但在compiler/typecheck/TcSplice.hs 中四处寻找似乎证实了reify 通过查找已经编译(和类型检查)的实体并转换编译器对其类型等的现有知识来工作. 进入 TH 的 Info 类型。对于任意的Exp,该信息将不存在。我想我们必须通过另一个编译器通道来检测表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多