2012-04-18 6 views
11

इस उद्धरण का क्या अर्थ है?सूची फ़ैक्टर नोडेटर्मेनिस्टिक विकल्प के संदर्भ का प्रतिनिधित्व क्यों करता है?

the list functor represents a context of nondeterministic choice; 

कार्यात्मक प्रोग्रामिंग में फंक्चर के संदर्भ में।

मुझे लगता है कि मैं समझता हूं कि एक फंक्शन एक प्रकार का "कंटेनर" है जिसमें संरचना को बदलने के बिना कंटेनर में तत्वों को समान रूप से फ़ंक्शन लागू करने की क्षमता होती है। तो शायद एक फंक्चर है जो संभावित विफलता के साथ एक संदर्भ या कंटेनर का प्रतिनिधित्व करता है, लेकिन सूची नोडेटर्मेनिस्टिक विकल्प के साथ संदर्भ या कंटेनर का प्रतिनिधित्व क्यों करती है?

+2

यह उद्धरण कहां से है? मैंने सूची _monad_ को nondeterministic पसंद का प्रतिनिधित्व करने के बारे में सुना है, लेकिन सूची _functor_ नहीं है। – ivanm

+0

उद्धरण निम्न है: http://www.haskell.org/haskellwiki/Typeclassopedia#Instances – groodt

उत्तर

11

जितना मैं कह सकता हूं उतना ही, गणना "नोडेटर्मिनिस्टिक" है यदि उसके पास कई संभावित उत्तर हैं। खैर, एक सूची में कई संभावित उत्तर हो सकते हैं। इसलिये।

(के रूप में करने के लिए कारण है कि यह गैर नियतात्मक कहा जाता है, मुझे पता नहीं है ... मैं गैर नियतात्मक की उम्मीद है | यादृच्छिक, जो कुछ अलग है मतलब करने के लिए।)

+9

नोडेटर्मिनिज्म शुद्ध यादृच्छिकता नहीं है, यह विशिष्ट विकल्पों के बीच मनमाने ढंग से पसंद कर रहा है। नोडेटर्मिनिज्म मॉडल करने का एक तरीका है * सभी * संभावित विकल्पों में से सभी बनाना (और इस मॉडल के लिए सूचियों का उपयोग किया जा सकता है), हालांकि आम तौर पर, जब हम एक नोडेटर्मेनिस्टिक मशीन के बारे में बात करते हैं, तो यह केवल एक विकल्प बनाता है, और हम भविष्यवाणी करने में असमर्थ हैं पसंद यह होगा, हालांकि हम जानते हैं कि यह वास्तव में क्या विकल्प * कर सकता है। –

+2

हां: उद्धरण के अर्थ में, सूचियों को कम किराए के मल्टीसेट के रूप में उपयोग किया जाता है, और प्रत्येक संभावित परिणाम को रखकर "नोडेटर्मिनिस्टिक पसंद" का प्रतिनिधित्व करता है। – comingstorm

+4

यदि यह बिल्कुल मदद करता है, तो यह एक एनएफए (नोडेटर्मिनिस्टिक परिमित-राज्य ऑटोमाटा) या एनटीएम (नोडेटर्मिनिस्टिक ट्यूरिंग मशीन) में समान "नोडेटर्मिनिस्टिक" है। –

4

"शास्त्रीय" संगणना 1 इनपुट लेने के लिए और देना 1 आउटपुट आप इन गैर-निर्धारिती गणनाओं के साथ क्या प्रतिनिधित्व करना चाहते हैं: अगर मैं इनपुट के बारे में निश्चित नहीं हूं तो आउटपुट के बारे में मैं क्या कह सकता हूं? अनिश्चितता का प्रतिनिधित्व करने के

दो सामान्य तरीकों पर विचार करना है:

  1. कि इनपुट का एक तत्व है एक दिया
  2. सेट है कि इनपुट एक ज्ञात संभावना वितरण द्वारा दिया जाता है

उदाहरण के तौर पर, फ़ंक्शन (2 *) पर विचार करें जो इनपुट को दोगुना करता है। इनपुट के मरने के परिणाम होने पर आप उस फ़ंक्शन के आउटपुट के बारे में क्या कह सकते हैं?

  1. मैं जानता हूँ कि मरने 6 चेहरे है तो परिणाम सेट में है {} 2,4,6,8,10,12
  2. मैं हर चेहरे की संभावनाओं को पता है 1/6 तो मैं जानता हूँ कि है कि इनमें से प्रत्येक संख्या में

सूची फ़ैक्टर 1 की भावना में गैर-निर्धारक गणनाओं का प्रतिनिधित्व करता है .: यह सूचियों द्वारा सेट का प्रतिनिधित्व करता है।

foo = do 
    x <- [1 .. 10] 
    y <- [2, 3, 5, 7] 
    return (x * y) 

क्या foo है:

4

निम्नलिखित पर विचार करें? खैर, यह, x * y है x 1 से 10 के एक नंबर जा रहा है, और y 5, या 7. जा रहा है या तो 2, 3, इसलिए की गैर नियतात्मक विकल्पों के साथ छोड़कर, foo कम्प्यूटेबिलिटी और जटिलता में [2, 3, 5, 7, 4, 6, 10, 14, etc... ]

8

परंपरागत रूप से है, एक नोडेटर्मिनिस्टिक गणना मॉडल ने एक मॉडल को संदर्भित किया है जिसमें आप "शाखा" कर सकते हैं।

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

सूची मोनाड में, यह वही है जो आप कर रहे हैं। उदाहरण के लिए, सूची इकाई में, clique problem के निर्णय संस्करण के लिए इस समाधान पर विचार करें:

cliques :: Int -> Graph -> [[Node]] 
cliques 0 _ = [[]] 
cliques minCliqueSize graph = do 
    v <- nodes graph 
    vs <- cliques (minCliqueSize - 1) (deleteNode v graph) 
    mapM_ (\ w -> guard (isAdjacent v w graph)) vs 
    return (v:vs) 

यह ठीक है कि कैसे आप जैसे कार्यक्रम था क्लिक्स समस्या को हल करने के लिए एक नोडेटर्मिनिस्टिक ट्यूरिंग मशीन।

5

एक कंटेनर के रूप में एक मजेदार देखने के अलावा, आप इसे एक निश्चित प्रकार के संदर्भ के रूप में भी देख सकते हैं। आपके मान उस संदर्भ में हैं, और यदि आप उन पर काम करना चाहते हैं, तो आप संदर्भ में फ़ंक्शन उठाने के लिए map का उपयोग करते हैं। इसे डालने का एक और तरीका यह है कि आपके मान उस संदर्भ के साथ बढ़ाए गए हैं।

यह समझने के लिए कि कैसे सूची फ़ैक्टर नोडेटर्मेनिस्टिक पसंद का संदर्भ है, यह देखने के लिए उपयोगी हो सकता है कि एक और मज़ेदार कैसे एक संदर्भ है: शायद मज़ेदार एक गणना का संदर्भ है जो असफल हो सकता है। यदि आप किसी फंक्शन में किसी फ़ंक्शन को फ़ंक्शन लागू करने का प्रयास करते हैं, तो परिणामी मान अभी भी वही संदर्भ रखेगा चाहे वह पहले स्थान पर असफल गणना हो या नहीं।

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

दान Burtons जवाब से थोड़ा उधार, सूचियों के लिए monadic अंकन को देखो:

foo = do 
    x <- [1 .. 10] 
    y <- [2, 3, 5, 7] 
    return (x * y) 

यह पहले थोड़ा अजीब लगता है पर जब से अंकन में इंगित करता है, कि आप से एक मान निकाल सकते प्रत्येक सूची में, लेकिन फिर आप परिणामस्वरूप एक सूची प्राप्त करते हैं जो 40 तत्व लंबा है। जब आप एक मूल्य के संदर्भ के रूप में फ़ैक्टर (अच्छी तरह से, इस मामले में monads) को देखते हैं तो यह अधिक समझ में आता है। उदाहरण में, x और y ऐसे मूल्य हैं, लेकिन उनका संदर्भ यह है कि वे nondeterministic हैं। जब आप दो ऐसे मानों को गुणा करते हैं, तो आपको और अधिक नोडेटर्मिनिज्म मिलता है, जिसके परिणामस्वरूप लंबी सूची होती है। तो monads और >>= के साथ, संदर्भ बदला जा सकता है, जबकि functors और map के साथ, यह नहीं कर सकता।

+0

_ "तो monads और >> = के साथ, संदर्भ बदला जा सकता है" _ क्या आप इसे विस्तारित कर सकते हैं? '(>> =) :: मोनाड एम => एम ए -> (ए -> एम बी) -> एम बी' इंगित करता है कि संदर्भ 'एम' संरक्षित होना चाहिए। या क्या आपका मतलब संदर्भ में 'ए' का आकार है, जो आपके उदाहरण में एक सूची '[ए]' है? – ftor

+1

हाँ, यह संदर्भ का आकार है। यदि आप किसी सूची में मानचित्र बनाते हैं, तो यह वही संख्या में आइटम रखता है, और यदि आप शायद अधिक से अधिक नक्शा रखते हैं, तो यह या तो बस या कुछ भी नहीं रहता है। लेकिन यदि आप इसका उपयोग करते हैं, तो '>> =' तो आप सूची में तत्वों की संख्या बदल सकते हैं, और आप बस कुछ भी नहीं बदल सकते हैं। और इसी तरह अन्य monads के लिए। लेकिन यह मोनैड को देखने का सिर्फ एक ही तरीका है, ऐसे अन्य मोनैड भी हैं जहां इसे किसी दिए गए ढांचे के साथ डेटा वैल्यू के रूप में देखने के लिए वास्तव में समझ में नहीं आता है, उदाहरण के लिए आईओ। – Boris

+0

'<*>'/'>> = 'हमेशा संदर्भ के आकार को संरक्षित नहीं कर सकता क्योंकि वे दो संदर्भों को जोड़ते हैं। और 'शुद्ध'/'वापसी 'एक न्यूनतम संदर्भ प्रदान करके बचाव में आती है जो कि किसी अन्य संदर्भ के साथ संयुक्त है, उस संदर्भ के आकार को बदलने में गारंटी नहीं है। आवेदक/मोनैड कानूनों के कारण 'शुद्ध '/' वापसी' की आवश्यकता है। मैं अंततः इसे समझ गया है: डी – ftor

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

  • कोई संबंधित समस्या नहीं^_^