Как получить объявление функции, используя `reify`?
Функция reify
позволяет мне искать информацию о данном имени. Для функции возвращаемое значение VarI
:
data Info = ... | VarI Name Type (Maybe Dec) Fixity | ...
Здесь я могу проверить тип функции, а также я хотел бы проверить ее объявление. Тем не менее, в 3-м аргументе VarI
Я всегда вижу Nothing
, Есть ли способ получить объявление функции?
1 ответ
Из документа haskell для шаблона в конструкторе VarI Info:
Переменная "значение" (в отличие от переменной типа, см.
TyVarI
).Maybe Dec
поле содержитJust
декларация, которая определила переменную - включая RHS декларации - или иначеNothing
, в случае, когда RHS недоступен для компилятора. В настоящее время это значение всегдаNothing
: возврат RHS еще не осуществлен из-за отсутствия интереса.
Глядя на исходное зеркало ghc на github, строка VarI
появляется только дважды, и оба в компиляторе / typecheck / TcSplice.lhs, реализующих reifyThing
функция:
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, который бы побудил кого-то сделать это).