2011-08-27 9 views
12

मैं कुछ टेम्पलेट हास्केल सीखने की कोशिश कर रहा हूं। एक अभ्यास के रूप में, मैंने एक ऐसा फ़ंक्शन लिखा जो isLeft और isRight (this question से प्रेरित) जैसी चीजें उत्पन्न कर सकता है। यहाँ मेरी विनम्र प्रयास है:

isA connam = do 
    ConE nam <- connam 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (conP nam [wildP]) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 

समस्या मैं अधिक सहज ज्ञान युक्त isA Left के बजाय $(isA [| Left |]) लिखने के लिए होता है। क्या बदसूरत वाक्यविन्यास से छुटकारा पाना संभव है? मुझे प्रलेखन में जवाब नहीं मिल रहा है।

फ़ंक्शन केवल एक-तर्क निर्माता के साथ काम करता है, लेकिन यह another question के लिए है।

उत्तर

10

सिंटैक्स एक कारण के लिए है; पाठक को सूचित करने के लिए कि संकलन-समय जादू यहां जा रहा है। जब आप अपना स्प्लिस शीर्ष स्तर पर हों तो आप केवल $(...) को हटा सकते हैं।

हालांकि, हम [| ... |] समाप्त कर सकते हैं और यह भी कोड अधिक प्रकार के लिए सुरक्षित में एक Name बजाय Exp एक के लेने से हो जाता है:

isA nam = do 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (conP nam [wildP]) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 

इस का उपयोग करने के लिए आपको $(isA 'Left) है, जो एक है लिखते हैं आंखों पर थोड़ा आसान।

एक बोनस के रूप में, यदि आप इसे अन्य कुछ देने की कोशिश एक Name से, आप एक प्रकार की त्रुटि के बजाय एक अकाट्य पैटर्न मैच त्रुटि मिलती है।

यह भी देखें: Template Haskell Syntax

+0

धन्यवाद। मैं निश्चित रूप से उस के साथ रह सकता हूँ। मुझे कहीं याद है कि स्प्लिसेस के लिए '$' अब आवश्यक नहीं है, लेकिन मुझे यकीन नहीं है कि यह किस संदर्भ में था, या यह यहां लागू हो सकता है या नहीं। –

+0

@ एनएम। मैंने अभी कहा कि एक पल पहले मेरे जवाब में :) मुझे लगता है कि आप अभी भी अपनी टिप्पणी लिखते समय अपना मूल जवाब देख रहे थे। – hammar

+0

आह, इसलिए यदि मैं वास्तविक कार्य के बजाय 'isaleft' नामक फ़ंक्शन की घोषणा उत्पन्न करने के लिए 'isA' Left 'चाहता हूं, तो मैं $ को छोड़ सकता हूं, है ना? –

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

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