2013-04-24 9 views
6

चलो कहते हैं कि मैं कुछ भाषा में एक एएसटी का प्रतिनिधित्व करने के लिए एक सरल डेटा प्रकार करते हैं: (। हकीकत में यह स्पष्ट रूप से इस से भी अधिक निर्माताओं के लिए होता है)मुझे अतिरिक्त जानकारी के साथ एनएसटी का प्रतिनिधित्व कैसे करना चाहिए?

data Term = Var String 
      | Num Integer 
      | Expr [Term] 

मैं इस का उपयोग कर सकते एक सरल मूल्यांकन लिखने के लिए समारोह जो एएसटी संरचना के खिलाफ मेल खाता है: बदले बिना

eval :: Term -> Result 
eval (Var name) = lookup name 
eval (Num n)  = return n 
eval (Expr exprs) = ... 

मैं लाइन नंबर की तरह जानकारी के साथ एएसटी व्याख्या सकते हैं कि कैसे काम करता है मिलान पैटर्न?

(मैं पैटर्न बदल रहा है मन नहीं था, मैं, रिकॉर्ड वाक्य रचना या दृश्य पैटर्न इस्तेमाल कर सकते हैं निश्चित रूप से।)

+2

'डेटा एटलाइन ए = एटलाइन इंट ए' जैसे कंटेनर एडीटी के बारे में क्या? –

+0

@ निकितावोल्कोव: यही वही है जो मैं व्यूपटरर्न जैसे कुछ के साथ करूंगा। मैं बस सोच रहा हूं कि पैटर्न मिलान को बदलने से बचने का कोई अच्छा तरीका है या नहीं। –

+0

यह पैटर्न मिलान को क्यों प्रभावित करेगा यदि यह एक 'टर्म' प्रकार है जिसे आप मेल खाते हैं? –

उत्तर

7

एएसटी क्यों प्रतिनिधित्व नहीं polymorphically

data Term term = Var String 
     | Num Integer 
     | Expr [term] 

फिर अपने orignal Term प्रकार

newtype SimplTerm = SimplTerm (Term (SimplTerm)) 

है और आप आसानी से क्या आप दृश्य पैटर्न के साथ चाहते हैं कर सकते हैं

+०१२३५१६४१०६
data AtLine = AtLine (Term AtLine) Integer 

view :: AtLine -> Term AtLine 
view (AtLine x _) = x 

eval (view -> Var name) = lookup name 
eval (view -> Num n) = numResult n 
eval (view -> Expr expr) = listResult (map eval expr) 

या देखने बहुरूपी

class AST t where 
    term :: t -> Term t 
instance AST SimplTemr where 
    term (SimplTemr x) = x 
instance AST AtLine where 
    term (AtLine x _) = x 

eval :: AST t => t -> Result 
eval (view -> Var name) = lookup name 
eval (view -> Num n) = numResult n 
eval (view -> Expr expr) = listResult (map eval expr) 

त्रुटि हैंडलिंग काश एक तरह से एक इकाई में प्रदर्शित करने के दृश्य पैटर्न प्राप्त करने के लिए किया गया था के लिए कर रही है, लेकिन यह जीवन (जो आप अगर view समारोह किया गया था कर सकता है सीपीएस में और इसलिए मूल्य को वापस करने के बजाए निरंतरता को तर्क के रूप में लिया गया)।

+2

'रिकर्सन-स्कीम' (हैकेज पर) में 'फिक्स' प्रकार और' फोल्डबल 'टाइप क्लास है जो क्रमशः' सरल टाइमर 'और' एएसटी 'के समान है। – ScootyPuff

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

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