函数reify允许我查找有关给定名称的信息。对于一个函数,返回的值是VarI
data Info = ... | VarI Name Type (Maybe Dec) Fixity | ...在这里,我可以检查函数的类型,也可以检查它的声明。但是,在VarI的第三个参数中,我总是看到Nothing。有办法得到函数的声明吗?
发布于 2013-11-21 17:48:49
来自template haskell docs on the VarI Info contructor
"value“变量(与类型变量相反,请参见
TyVarI)。Maybe Dec字段包含Just--定义变量的声明--包括声明的RHS --或者在编译器不可用的情况下,Nothing。目前,这个值始终是Nothing:由于缺乏兴趣,返回RHS还没有实现。
查看ghc source mirror on github、 only appears twice以及实现reifyThing函数的compiler/typecheck/TcSplice.lhs中的这两种功能:
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。
在一个看起来像是对reify系统的重写中,深入研究了this code was added in 2003。因此,它似乎很少有兴趣让它工作,因为它已经超过10多年来,该领域一直有价值的Nothing。因此,我猜如果您想要这个特性,您必须自己实现它(或者向ghc开发邮件列表提出一个很好的用例,以鼓励其他人这样做)。
https://stackoverflow.com/questions/20118008
复制相似问题