2016-10-30 4 views
5

मैं हैकेल सीख रहा हूं, और मुझे कई हस्केल अभिव्यक्तियों को मानसिक रूप से पार्स करने में बहुत कठिनाई है।मनमाने ढंग से हैकेल अभिव्यक्तियों को स्वचालित रूप से कैसे संश्लेषित करें?

बेशक, मुझे उम्मीद है कि, पर्याप्त अभ्यास के साथ, मानसिक रूप से पार्सिंग हैकेल दूसरी प्रकृति बन जाएगी, लेकिन इस बीच, मैं जो कुछ भी आया हूं उसे समझने के लिए, मैं कुछ स्वचालित तरीका ढूंढना चाहता हूं एक मनमाना "मानक हैकेल" का अनुवाद करें अभिव्यक्ति जिसमें एक "संदिग्ध" उप-अभिव्यक्ति आवश्यक कोष्ठक पेश करके समाप्त कर दी गई है।

उदाहरण के लिए, यह अभिव्यक्ति

f g h i 

अनुवाद होगा ...

((f g) h) i 

..., या

a -> b -> c -> d 

में ...

a -> (b -> (c -> d)) 
में

..., आदि

अधिमानतः, यह एक ऐसा उपकरण होगा जो मैं अपने फोन से एक्सेस कर सकता हूं, क्योंकि मैं एक उचित कंप्यूटर से हैकेल पर अपने अधिकांश पढ़ने को करता हूं।


बेशक, ऐसी कोई उपकरण संभवतः अज्ञात स्थिरता और संबद्धता का कस्टम ऑपरेटरों के साथ काम कर सकता है। "मानक हैकेल" से मेरा मतलब है कि प्रीलूड और मानक हैकेल लाइब्रेरी में परिभाषित सामग्री।

मैं "पूर्वता नियमों के अभाव में अस्पष्ट" के लिए आशुलिपि के रूप में उपयोग कर रहा हूँ "अस्पष्ट" यहाँ। जैसे 2 + 3 * 5 संदिग्ध है जब तक कुछ प्राथमिकता नियम है जो इस सवाल को सुलझता है कि दोनों में से कौन से संचालन पहले किए जाएंगे।

+0

मैं अपने _phone_ पर कुछ भी के बारे में सोच नहीं कर सकते, लेकिन वहाँ कुछ बहुत सरल चीजें आप GHCi – Alec

+0

खैर में कर सकते हैं, [Haskell-src-exts] (http: //hackage.haskell। संगठन/पैकेज/हैकेल-src-exts-1.18.2/डॉक्स/भाषा-हास्केल-एक्स्ट्स.html) पूरी तरह से अस्पष्ट पार्स पेड़ प्राप्त करना और इसे प्रिंट करना आसान बनाता है। लेकिन यह वास्तव में पठनीय नहीं है। एक बार जब आपने इसे इंस्टॉल किया है तो ghci से '(fmap। Fmap। Fmap) (const()) (parseFile" foo.hs ") आज़माएं। –

+0

@ एलेक: मैं ghci में वास्तव में क्या कर सकता हूं? (फोन के बारे में: यह केवल एक वरीयता थी, और उस पर हल्का था, अगर इस मामले में कोई विकल्प था, यदि वहां नहीं है, तो मैं खुशी से ghci के लिए व्यवस्थित रहूंगा।) – kjo

उत्तर

9

यदि आप वास्तव में इसके काम पर जाना चाहते हैं, तो आप यह करने के लिए TemplateHaskell फ़ंक्शन लिख सकते हैं - आप अनिवार्य रूप से केवल एएसटी चलते हैं और इच्छानुसार माता-पिता जोड़ते हैं। मैंने ऐसा करना शुरू कर दिया, लेकिन महसूस किया कि यह बहुत लंबा और कठिन हो जाएगा। मुझे लगता है कि यह वास्तव में आपके लिए खेलने के बारे में सोचने के लिए और अधिक सुविधाजनक हो सकता है जब यह वास्तव में खेल में आता है (उन कार्यों के साथ जो पूरी तरह से लागू नहीं होते हैं)। ऑपरेटरों जिसका स्थिरता और संबद्धता आप से परिचित नहीं हैं चारों ओर कोष्ठक:


हालांकि, वहाँ एक चाल आप अपनी समस्या का एक subcase के लिए उपयोग कर सकते हैं। जीएचसीआई में, सही झंडे के साथ बूट करने के बाद, $([| <expression> |]) में निरीक्षण करने में रुचि रखने वाली अभिव्यक्ति को लपेटें। फिर, आपको मूल्यांकन के परिणाम से पहले अपनी अभिव्यक्ति का एक संश्लेषित संस्करण देखना होगा।

$ ghci -ddump-splices -XTemplateHaskell 
Prelude> $([| 1 + 2^3 * 4 |]) 
<interactive>:1:3-21: Splicing expression 
    [| 1 + 2^3 * 4 |] ======> (1 + ((2^3) * 4)) 
33 
Prelude> $([| 1 <$ pure 4 >>= \x -> const mempty =<< [(+),(*)] <*> [1,2] <* [False] |]) 
<interactive>:2:3-77: Splicing expression 
    [| 1 <$ pure 4 
     >>= 
     (\ x_a6PT -> const mempty =<< [(+), (*)] <*> [1, 2] <* [False] |] 
    ======> 
    ((1 <$ (pure 4)) 
    >>= 
     (\ x_a6PT 
      -> ((const mempty) =<< (([(+),(*)] <*> [1,2]) <* [False])))) 
[] 
Prelude> 

हालांकि, यह निश्चित रूप से टाइप हस्ताक्षर या फ़ंक्शन एप्लिकेशन को जिस तरह से आप चाहते हैं उसे ठीक नहीं करेगा।

4

यह आप के लिए वास्तव में क्या नहीं पूछ रहे हैं, लेकिन मैं HLint का उपयोग कर पाया है मुझे अनावश्यक कोष्ठक के बारे में चेतावनी देने के लिए जब मैं लेखन हास्केल भारी सहायता कर जब मैं पढ़ने हूँ हूँ।

आप Bernie Pope's "A tour of the Haskell Prelude" के पेज 23 पर चार्ट भी पा सकते हैं। मैंने नीचे एक प्रतिलिपि शामिल की है।

page 23 of Bernie Pope's "A tour of the Haskell Prelude"

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