首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用“`reify`”获得函数的声明?

如何使用“`reify`”获得函数的声明?
EN

Stack Overflow用户
提问于 2013-11-21 10:12:35
回答 1查看 335关注 0票数 10

函数reify允许我查找有关给定名称的信息。对于一个函数,返回的值是VarI

代码语言:javascript
复制
data Info = ... |  VarI Name Type (Maybe Dec) Fixity  | ...

在这里,我可以检查函数的类型,也可以检查它的声明。但是,在VarI的第三个参数中,我总是看到Nothing。有办法得到函数的声明吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的这两种功能:

代码语言:javascript
复制
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开发邮件列表提出一个很好的用例,以鼓励其他人这样做)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20118008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档