函数reify
允许我查找有关给定名称的信息。对于函数,返回值为VarI
:
data Info = ... | VarI Name Type (Maybe Dec) Fixity | ...
在这里我可以检查函数的类型,并且我还想检查它的声明。但是,在VarI
我总是看到的第三个参数中Nothing
。有没有办法获得函数的声明?
来自VarI Info 构造函数的模板 haskell 文档:
“值”变量(与类型变量相反,请参阅 参考资料
TyVarI
)。该Maybe Dec
字段包含Just
定义变量的声明——包括声明的 RHS——否则Nothing
,在编译器无法使用 RHS 的情况下。目前,该值始终Nothing
为:由于缺乏兴趣,尚未执行返回 RHS。
查看github上的ghc源码镜像,字符串VarI
只出现了两次,而且都在实现函数的compiler/typecheck/TcSplice.lhsreifyThing
中:
reifyThing :: TcTyThing -> TcM TH.Info
-- The only reason this is monadic is for error reporting,
-- which in turn is mainly for the case when TH can't express
-- some random GHC extension
reifyThing (AGlobal (AnId id))
= do { ty <- reifyType (idType id)
; fix <- reifyFixity (idName id)
; let v = reifyName id
; case idDetails id of
ClassOpId cls -> return (TH.ClassOpI v ty (reifyName cls) fix)
_ -> return (TH.VarI v ty Nothing fix)
}
reifyThing (AGlobal (ATyCon tc)) = reifyTyCon tc
reifyThing (AGlobal (ADataCon dc))
= do { let name = dataConName dc
; ty <- reifyType (idType (dataConWrapId dc))
; fix <- reifyFixity name
; return (TH.DataConI (reifyName name) ty
(reifyName (dataConOrigTyCon dc)) fix)
}
reifyThing (ATcId {tct_id = id})
= do { ty1 <- zonkTcType (idType id) -- Make use of all the info we have, even
-- though it may be incomplete
; ty2 <- reifyType ty1
; fix <- reifyFixity (idName id)
; return (TH.VarI (reifyName id) ty2 Nothing fix) }
reifyThing (ATyVar tv tv1)
= do { ty1 <- zonkTcTyVar tv1
; ty2 <- reifyType ty1
; return (TH.TyVarI (reifyName tv) ty2) }
reifyThing thing = pprPanic "reifyThing" (pprTcTyThingCategory thing)
就像模板 haskell 文档所说,用于该字段的值总是Nothing
.
深入挖掘,这段代码是在 2003 年添加的,看起来像是对 reify 系统的重写。所以它似乎没有兴趣让它发挥作用,因为这个领域已经有 10 多年的历史了,它一直具有价值Nothing
。所以我猜你是否想要这个功能,你必须自己实现它(或者向 ghc 开发邮件列表提出一个好的用例,鼓励其他人这样做)。