是否可以使用 Template Haskell 获得任何类型的表达式?

Posted

技术标签:

【中文标题】是否可以使用 Template Haskell 获得任何类型的表达式?【英文标题】:Is it possible to get a type of any expression using Template Haskell? 【发布时间】:2014-02-24 18:46:35 【问题描述】:

给定一个表达式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 的唯一具体化函数,而且它只接受名字,我猜你已经很受约束了。 【参考方案1】:

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

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

【讨论】:

以上是关于是否可以使用 Template Haskell 获得任何类型的表达式?的主要内容,如果未能解决你的问题,请参考以下文章

来自元组的函数 - Haskell

广州设计周 ▏Haskell一体式座椅获红棉奖颁奖仪式回顾

是否可以使用 Ghcjs、Haste、Elm 等在服务器端渲染 Haskell 前端?

是否有类似于 Haskell 的 $(美元符号)的 Scala 运算符?

是否有与 Haskell 'let' 等效的 Python

是否有任何haskell函数可以将列表与分隔符连接起来?