是否可以使用 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 Info
或Exp -> Q Type
之类的函数,是吗? TH 不提供这样的功能。产生Info
的唯一 TH 函数是 reify
,似乎没有其他 TH 类型会公开您所追求的类型信息。目前的 TH API 似乎没有提供具体化任意表达式的方法。
我不是 GHC 内部的专家,但在compiler/typecheck/TcSplice.hs
中四处寻找似乎证实了reify
通过查找已经编译(和类型检查)的实体并转换编译器对其类型等的现有知识来工作. 进入 TH 的 Info
类型。对于任意的Exp
,该信息将不存在。我想我们必须通过另一个编译器通道来检测表达式。
【讨论】:
以上是关于是否可以使用 Template Haskell 获得任何类型的表达式?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Ghcjs、Haste、Elm 等在服务器端渲染 Haskell 前端?