2013-11-21 14 views
10

फ़ंक्शन reify मुझे किसी दिए गए नाम के बारे में जानकारी देखने की अनुमति देता है। एक समारोह के लिए दिए गए मान VarI है:'रीफाई' का उपयोग करके फ़ंक्शन की घोषणा कैसे प्राप्त करें?

data Info = ... | VarI Name Type (Maybe Dec) Fixity | ... 

यहाँ मैं समारोह के प्रकार जांच कर सकते हैं, और मैं भी अपने घोषणा की जांच करना चाहते हैं। हालांकि, तीसरे तर्क में VarI पर मैं हमेशा Nothing देखता हूं। क्या समारोह की घोषणा पाने का कोई तरीका है?

+0

यह एक उत्कृष्ट सवाल है। मैंने परिभाषा 'INLINE' या' INLINEABLE' को चिह्नित करने का प्रयास किया है, और न ही कोई फर्क नहीं पड़ता। मुझे संदेह है कि यह बिल्कुल लागू नहीं किया गया है, लेकिन मुझे नहीं पता। – Carl

+0

संभव डुप्लिकेट [फ़ंक्शन हास्केल का उपयोग फ़ंक्शन के शरीर को प्राप्त करने के लिए कैसे करें?] (Http://stackoverflow.com/questions/13983391/how-to-use-template-haskell-to-get-the-body-of -समारोह) – jberryman

उत्तर

7

template haskell docs on the VarI Info contructor से:

एक "मूल्य" चर (के रूप में एक प्रकार चर करने का विरोध किया, TyVarI देखें)। Maybe Dec फ़ील्ड में Just घोषणा है जिसमें घोषणापत्र परिभाषित किया गया है - घोषणा के आरएचएस सहित - या अन्य Nothing, जहां आरएचएस संकलक के लिए अनुपलब्ध है। वर्तमान में, यह मान हमेशाNothing: आरएचएस लौटने पर अभी भी ब्याज की कमी के कारण लागू नहीं किया गया है।

ghc source mirror on github को देखते हुए, string VarI only appears twice, और दोनों 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 है।

डिगिंग डिपर, this code was added in 2003, जो कि सुधार प्रणाली के पुनर्लेखन की तरह दिखता है। इसलिए यह काम करने में थोड़ा रूचि प्रतीत होता है क्योंकि यह 10 से अधिक वर्षों से रहा है कि क्षेत्र में हमेशा Nothing का मूल्य होता है। इसलिए मैं अनुमान लगा रहा हूं कि यदि आप इस सुविधा को चाहते हैं तो आपको इसे स्वयं लागू करना होगा (या ghc विकास मेलिंग सूची में एक अच्छा उपयोग केस प्रस्तावित करना जो किसी और को ऐसा करने के लिए प्रोत्साहित करेगा)।

संबंधित मुद्दे

 संबंधित मुद्दे