2011-04-30 13 views
37

क्लोजर, कार्यात्मक प्रतिमान पर इस तरह के जोर के बावजूद, वैकल्पिक मूल्यों का प्रतिनिधित्व करने के लिए Maybe/Option मोनैड का उपयोग क्यों नहीं करता है? Option का उपयोग स्कैला में काफी व्यापक है, जो एक कार्यात्मक प्रोग्रामिंग भाषा है जिसे मैं नियमित रूप से उपयोग करता हूं।क्लोजर में शायद/विकल्प का उपयोग इतना व्यापक क्यों नहीं है?

+2

मैं डैनियल के उत्कृष्ट उत्तर को इंगित करने जा रहा हूं कि स्कैला विकल्प का उपयोग क्यों करता है [टी]; शायद जवाब इसे पहले पढ़ना चाहिए। - http://stackoverflow.com/questions/2079170/why-optiont/2079758#2079758 –

उत्तर

45

क्लोजर स्थैतिक रूप से टाइप नहीं किया गया है, इसलिए सैकड़ों में (या, मैं इकट्ठा, स्कैला) में आवश्यक/जो/जो भी प्रकार की घोषणाओं की आवश्यकता नहीं है, उसे सख्त करने की आवश्यकता नहीं है। यदि आप एक स्ट्रिंग वापस करना चाहते हैं, तो आप एक स्ट्रिंग वापस कर देते हैं; यदि आप बदले में शून्य वापस आते हैं, तो यह भी ठीक है।

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

+5

आपको शायद मेरा प्रश्न नहीं मिला। मेरे प्रश्न में टाइप घोषणाओं के साथ बिल्कुल कुछ नहीं है। – missingfaktor

+3

मेरे अनुभव में, 'शायद'/'विकल्प' इस बात पर ध्यान दिए बिना कि प्रश्न में भाषा स्थिर रूप से टाइप की गई है या गतिशील रूप से टाइप की गई है या नहीं। – missingfaktor

+27

@missingfaktor: नहीं, मुझे लगता है कि अमालोय की एक बिंदु-गतिशील रूप से टाइप की गई भाषाएं अक्सर "ऐसी कोई चीज़" का प्रतिनिधित्व करने के लिए कुछ मूल्य (जैसे 'शून्य') का उपयोग करती हैं, लेकिन यह मान एक अलग प्रकार का है (योजना में, यह एक सूची है रूबी में, यह 'नील क्लास' का एकमात्र उदाहरण है; मैंने क्लोजर का कभी भी उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह इस संबंध में योजना की तरह है)। स्थिर प्रकार प्रणाली के बिना, परिणाम को 'शायद' में उठाने की कोई आवश्यकता नहीं है; यह बोलने के लिए, निहित है। मैं व्यक्तिगत रूप से हास्केल/स्कैला के तरीके को पसंद करता हूं, लेकिन गतिशील रूप से टाइप की गई भाषा में अन्य दृष्टिकोण के साथ कुछ भी गलत नहीं है। –

12

शायद/विकल्प एक प्रकार है। कार्यात्मक प्रोग्रामिंग के साथ इसका कोई लेना-देना नहीं है। हां, कुछ भाषाओं (स्कैला, हैकेल, ओकंपल) कार्यात्मक होने के अलावा एक बहुत ही शक्तिशाली प्रकार प्रणाली प्रदान करते हैं। लोग हैकेल के बारे में भी कहते हैं कि यह टाइपिंग के साथ एक प्रोग्रामिंग है।

अन्य (क्लोजर, लिस्प) प्रकारों के मामले में बहुत अधिक प्रदान नहीं करते हैं, भले ही वे पूरी तरह कार्यात्मक भाषाएं हों। उनका जोर अलग है, और शायद/विकल्प प्रकार फिट नहीं है। यह आपको गतिशील भाषा में बहुत कुछ नहीं देता है। उदाहरण के लिए अनुक्रमों (सूचियों, वैक्टर, मानचित्र) पर चलने वाले कई क्लोजर फ़ंक्शन पूरी तरह से शून्य (शून्य) स्वीकार करेंगे और इसे खाली संरचना के रूप में मानेंगे।

(गिनती शून्य) आप 0. दे देंगे वैसे ही जैसे (गिनती [])

Clojure "प्रकार के साथ प्रोग्रामिंग" एक नहीं कहा जा सकता है और इस तरह हो सकता है कि प्रकार उस में ज्यादा मतलब नहीं है।

7

वैसे वहाँ है एक हो सकता है, लेकिन इकाई यह कुछ भी नहीं है के रूप में नहीं के बराबर का उपयोग करता है, केवल गणना की अमूर्त पर कब्जा (यदि इनपुट = शून्य वापसी नहीं के बराबर किसी और calc इनपुट के साथ जो कुछ भी) अशक्त संकेत त्रुटियों से बचने के लेकिन यह does not स्थिर संकलन है समय सुरक्षा। fnil भी है जिसमें एक समान मिशन है, डिफ़ॉल्ट मानों के साथ पैचिंग शून्य और -?> है। मुझे लगता है कि क्लोजर तरीका डिफ़ॉल्ट मानों को वापस करने के लिए अधिक उन्मुख है जो त्रुटियों या शून्य को बढ़ाते हैं।

4

@amalloy के साथ जाकर और टिप्पणियां कि क्लोजर, एक भाषा के रूप में, वैकल्पिक वापसी मूल्य की आवश्यकता नहीं है।

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

मैंने क्लोजर-कंट्रीब लाइब्रेरी पर एक त्वरित नज़र डाली, और उनके पास monad package है जिसे आप देखना चाहते हैं। एक अन्य वस्तु जिसने वास्तव में मुझे क्लोजर में मोनाड्स का उपयोग करने के तरीके में चिपकाया, Cosmin's tutorial on Monads in Clojure है। यह वह था जो मुझे स्केल में स्पष्ट रूप से बताई गई कार्यक्षमता को गतिशील क्लोजर भाषा के हिस्से के रूप में संभालने में मदद करता है।

20

क्लोजर में, नील पनिंग अधिकांश कार्यक्षमता प्रदान करता है जो स्कैला & हास्केल विकल्प & से हो सकता है।

**Scala**    **Clojure** 
Some(1) map (2+_)  (if-let [a 1] (+ 2 a)) 

Some(1) match {   (if-let [a 1] 
    case Some(x) => 2+x  (+ 2 a) 
    case None => 4  4) 
} 

स्काला का विकल्प & हास्केल के शायद अनुप्रयोगी के दोनों उदाहरण हैं। इसका मतलब है कि आप समझ में इन प्रकार के मूल्यों का उपयोग कर सकते हैं। उदाहरण के लिए, स्कैला का समर्थन करता है:

for { a <- Some(1) 
     b <- Some(2) 
} yield a + b 

मैक्रो के लिए क्लोजर सीक पर समझ प्रदान करता है। Monadic समझ के विपरीत, यह कार्यान्वयन उदाहरण प्रकार मिश्रण मिश्रण की अनुमति देता है।

हालांकि क्लोजर का उपयोग कई संभावित शून्य मूल्यों पर कार्यों को लिखने के लिए नहीं किया जा सकता है, यह कार्यक्षमता लागू करने के लिए तुच्छ है।

(defn appun [f & ms] 
    (when (every? some? ms) 
    (apply f ms))) 

और यह बुला:

(appun + 1 2 3) #_=> 6 
(appun + 1 2 nil) #_=> nil 
10

यह याद रखना महत्वपूर्ण है कि इकाई अवधारणा प्रकार के बारे में नहीं है महत्वपूर्ण है! टाइप सिस्टम आपको नियमों को लागू करने में मदद करते हैं (लेकिन यहां तक ​​कि हास्केल भी सभी नियमों को लागू नहीं कर सकता है, क्योंकि उनमें से कुछ (मॉनाड लॉ) को किसी प्रकार की प्रणाली द्वारा पूरी तरह से व्यक्त नहीं किया जा सकता है।

मोनाड्स रचना के बारे में हैं, जो एक बहुत है महत्वपूर्ण बात यह है कि हम सभी हर प्रोग्रामिंग भाषा में हर दिन करते हैं। सभी मामलों में, मोनाड क्या हो रहा है इसके बारे में कुछ "अतिरिक्त संदर्भ" ट्रैक करता है ... इसके बारे में सोचें कि वर्तमान मूल्य पर एक बॉक्स है। कार्य लागू किया जा सकता है इस मूल्य के लिए, और अतिरिक्त संदर्भ एक ऑर्थोगोनल चिंता के रूप में विकसित हो सकता है।

हो सकता है कि असफलता के बारे में कुछ भी नहीं कहने के दौरान हो सकता है कि संभवतः गणना के लंबे अनुक्रमों को चेन करने के बारे में है (जो "अतिरिक्त संदर्भ" है)। यह एक पैटर्न है जो गणना के बाहर "त्रुटि प्रबंधन" को स्थानांतरित करता है और मोनाद में। आप शायद किसी भी तरह की गणनाओं के अनुक्रम को स्ट्रिंग कर सकते हैं और जैसे ही कोई विफल हो जाता है, बाकी को अनदेखा कर दिया जाता है और अंतिम परिणाम "कुछ नहीं" होता है। यदि वे सभी सफल होते हैं, तो आपका अंतिम परिणाम मोनैड परिणाम मूल्य धारण करता है।

यह आपको कोड लिखने की अनुमति देता है जो बहुत कम उलझन में है।

क्लोजर मोनाड्स का समर्थन करता है, क्योंकि @ डीटरब ने बताया।

+0

के लिए शून्य का उपयोग करता है, अंत में, श्रेणी सिद्धांत को समझने के बिना मोनाड्स की व्याख्या। यह वास्तव में मोनाड्स के बारे में क्या है। यह शर्म की बात है कि स्पष्टीकरण पर सबसे अधिक प्रयास आर्केन गणित के साथ इसे खराब कर देते हैं। –