2017-07-24 7 views
6

यह खरोज ठीक काम करता है:इंडेंटेशन नियम के साथ कौन सा मैच यहां खेल रहा है?

match 5 with 
| k when k < 0 -> 
    "value is negative" 
| k -> "value is non-negative" 
|> printfn "%s" 

लेकिन यह नहीं करता है:

match 5 with 
| k when k < 0 -> 
    "value is negative" 
| k -> 
    "value is non-negative" 
|> printfn "%s" 

कौन सा एफ # खरोज नियम खेल में है?

उत्तर

6

यह match के तहत इंडेंटेशन का संयोजन है और ऑपरेटरों के लिए विशेष मामला है।

पहले,match के तहत, प्रत्येक मामले का शरीर ऊर्ध्वाधर रेखा के रूप में अब तक शुरू हो सकता है। उदाहरण के लिए, इस काम करता है:

match 5 with 
| x -> 
"some value" 

दूसरा, वहाँ कि एक नई लाइन की शुरुआत में दिखाई ऑपरेटरों के लिए एक विशेष ऑफसेट नियम है: इस तरह के ऑपरेटरों चौड़ाई अप करने के लिए पिछले लाइन के बाईं ओर हो सकता है ऑपरेटर प्लस वन के। उदाहरण के लिए, इन सभी हूबहू काम:

let x = 
    "abc" 
    |> printf "%s" 

let y = 
     "abc" 
    |> printf "%s" 

let z = 
"abc" 
    |> printf "%s" 

तो, अपने दूसरे उदाहरण में, match के दूसरे मामले printfn लाइन, क्योंकि आगे पाइप ऑपरेटर की शुरुआत से बाईं ओर स्वीकार्य सहिष्णुता के भीतर है शामिल पहली पंक्ति

enter image description here

आप स्ट्रिंग सही करने के लिए "value is non-negative" सिर्फ दो रिक्त स्थान ले जाते हैं, आगे पाइप सहिष्णुता के भीतर अब और नहीं होगा, और इसलिए printfn लाइन मैच के बाहर होने के रूप में व्याख्या की जाएगी।

match 5 with 
| k when k < 0 -> 
    "value is negative" 
| k -> 
    "value is non-negative" 
|> printfn "%s" 

अपने पहले उदाहरण में, यह, सही करने के लिए 5 रिक्त स्थान ले जाया गया ताकि भी काम करता है है।

+6

यह गलती से, 4 रिक्त स्थानों द्वारा नियमित रूप से इंडेंट करने के लिए एक अच्छा तर्क है: क्योंकि 2 रिक्त स्थानों से इंडेंटिंग अक्सर इस समस्या में भाग लेती है, लेकिन 4 रिक्त स्थानों से इंडेंटिंग केवल इस समस्या में ही चल सकती है यदि अगली पंक्ति पर ऑपरेटर है कम से कम तीन अक्षर लंबा, जैसे '> =>'। यह नहीं कि 4-स्पेस इंडेंटेशन * पूरी तरह से * समस्या से मुक्त होगा: '> =>' और '>> =' जैसे ऑपरेटर सामान्य उपयोग में हैं। लेकिन वे '|>' से बहुत कम आम हैं, जो 2-स्पेस इंडेंटेशन के साथ समस्याएं पैदा करते हैं लेकिन 4 के साथ नहीं। – rmunn

+0

क्या किसी ने कभी भी "डी इंडेंट ऑपरेटर" शैली में लिखे गए कोड को देखा है जो इस नियम की अनुमति देता है? मैंने कभी इसे समस्याओं का कारण बना दिया है। – Tarmil

+0

@ टर्मिल यह बराबर महत्व के कई तर्कों के बीच ऑपरेटरों को लागू करने के लिए वास्तव में अच्छा काम करता है। दस अभिव्यक्तियों की एक कल्पना कीजिए, जहां प्रत्येक अभिव्यक्ति अपनी लाइन में होने के लिए काफी लंबी है। आप अभिव्यक्ति को एक दूसरे के नीचे सीधे संरेखित करना चाहते हैं ताकि वे इस तथ्य को प्रतिबिंबित कर सकें कि वे सभी बराबर हैं, कोई भी दूसरों की तुलना में अधिक महत्वपूर्ण नहीं है। –

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