2010-06-04 17 views
5

कोड में:क्या पारित किया जा रहा है?

oneChar :: Char -> Doc 
oneChar c = case lookup c simpleEscapes of 
       Just r -> text r 
       Nothing | mustEscape c -> hexEscape c 
         | otherwise -> char c 
    where mustEscape c = c < ' ' || c == '\x7f' || c > '\xff' 

simpleEscapes :: [(Char, String)] 
simpleEscapes = zipWith ch "\b\n\f\r\t\\\"/" "bnfrt\\\"/" 
    where ch a b = (a, ['\\',b]) 

आर oneChar को पारित नहीं किया जा रहा है। आर कहाँ से आता है?

उत्तर

5

lookup c simpleEscapesMaybe String मान देता है, जो या तो Nothing या Just <a string> हो सकता है। r, स्ट्रिंग Just में निहित है के रूप में लाइन द्वारा परिभाषित:

Just r -> text r 
1

आप मूल्य, हो सकता है कि इस प्रकार का है जो ग simpleEscapes देखने द्वारा दिया पर मामला कथन का उपयोग कर रहे हैं। शायद दो डेटा कन्स्ट्रक्टर हैं: बस और कुछ भी नहीं। जस्ट डेटा कन्स्ट्रक्टर को एक मान द्वारा पैरामीटर किया गया है, कुछ भी डेटा कन्स्ट्रक्टर में कोई पैरामीटर नहीं है।

तो इस मामले में, आर बस डेटा कन्स्ट्रक्टर के लिए औपचारिक पैरामीटर है: यह लुकअप से लौटाए गए मूल्य में वास्तविक मूल्य है।

2

जहां पहचानकर्ता शुरू की है आप पूछ रहे हैं, यह case बयान में पैटर्न मैच से बंधे है, उसी तरह पहचानकर्ता c समारोह परिभाषा पैटर्न मैच से बाध्य है।

(\(Just x) -> x) foo 

let (Just x) = foo in x 

f (Just x) = x 

case foo of 
    Just x -> x 

... उन सभी x नामक एक नया पहचानकर्ता परिचय:

किसी भी पैटर्न मैच जुड़े अभिव्यक्ति के लिए एक नया पहचानकर्ता लागू कर सकते हैं। वास्तव में, वे सब काफी समकक्ष हैं, क्योंकि कंपाइलर उन सभी को हुड के नीचे case ब्लॉक में परिवर्तित करता है।

3

केस कीवर्ड एक पैटर्न मैच पेश करता है, जिसमें फॉर्म case EXPR of (PATTERN -> EXPR)+ है। तो Just r एक पैटर्न है, जो lookup c simpleEscapes of के परिणाम से मेल खाता है। एक पैटर्न में, चर बाध्य किया जा सकता है। असल में इसका मतलब है, अगर lookup c simpleEscapes ofJust देता है तो r उस Just के अंदर मान के लिए बाध्य होगा और अभिव्यक्ति का परिणाम text r होगा।

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