2011-10-06 17 views
15

संभव डुप्लिकेट:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?कार्य

क्या कार्यों some और manyAlternative प्रकार कक्षा में लिए उपयोगी होते हैं? Docs एक पुनरावर्ती परिभाषा प्रदान करता है जिसे मैं समझने में असमर्थ था।

+0

@ लांदेई: मैंने उस धागे में जवाब पढ़ा, और मुझे अभी भी यह नहीं मिला है। – missingfaktor

+0

मैंने अभी कहा है कि यह प्रश्न एक डुप्लिकेट है, न कि मूल के पास एक अच्छा जवाब था :-) हालांकि यह मेरे लिए काफी अच्छा था: मुझे पता चला कि ये फ़ंक्शन मेरे लिए दिलचस्प नहीं हैं ... – Landei

+0

@Landei: मैं आपके जैसा ही निष्कर्ष निकाल रहा हूं। :-) – missingfaktor

उत्तर

33

some और many रूप में परिभाषित किया जा सकता है:

some f = (:) <$> f <*> many f 
many f = some f <|> pure [] 

शायद यह मदद करता है देखने के लिए कैसे some monadic do वाक्य रचना के साथ लिखा जाएगा:

some f = do 
    x <- f 
    xs <- many f 
    return (x:xs) 

तो some f रन f एक बार, फिर "कई "बार, और परिणाम conses। many f रन f "कुछ" बार, या "वैकल्पिक रूप से" बस खाली सूची देता है। विचार यह है कि वे दोनों f जितनी बार संभव हो सके "विफल" होने तक, सूची में परिणाम एकत्रित करते हैं। अंतर यह है कि some f विफल रहता है यदि f तत्काल विफल रहता है, जबकि many f सफल होगा और खाली सूची "वापस" करेगा। लेकिन इसका क्या मतलब है वास्तव में <|> परिभाषित किया गया है इस पर निर्भर करता है।

क्या यह केवल पार्सिंग के लिए उपयोगी है? चलो देखते हैं कि आधार के उदाहरणों के लिए यह क्या करता है: Maybe, [] और STM

पहले MaybeNothing का अर्थ विफलता है, इसलिए some Nothing भी विफल रहता है और Nothing पर मूल्यांकन करता है जबकि many Nothing सफल होता है और Just [] का मूल्यांकन करता है। some (Just()) और many (Just()) दोनों कभी वापस नहीं आते हैं, क्योंकि Just() कभी विफल नहीं होता है! एक अर्थ में वे Just (repeat()) का मूल्यांकन करते हैं।

सूचियों के लिए, [] विफलता का मतलब है, तो some [][] (कोई जवाब) का मूल्यांकन करते हुए many [][[]] का मूल्यांकन (वहाँ एक ही जवाब है और यह खाली सूची है)। फिर some [()] और many [()] वापस न आएं। उदाहरणों का विस्तार, some [()] का अर्थ है fmap (():) (many [()]) और many [()] का अर्थ some [()] ++ [[]] है, इसलिए आप कह सकते हैं कि many [()]tails (repeat()) जैसा ही है।

STM के लिए, विफलता का मतलब है कि लेनदेन को पुनः प्रयास करना होगा। तो some retry खुद को पुनः प्रयास करेगा, जबकि many retry बस खाली सूची वापस कर देगा। some f और many ff बार-बार इसे फिर से चलने तक चलाएगा। मुझे यकीन नहीं है कि यह उपयोगी चीज है, लेकिन मुझे लगता है कि यह नहीं है।

तो, Maybe, [] और STMmany और some के लिए जो उपयोगी हो करने के लिए नहीं है।यह केवल तभी उपयोगी होता है जब आवेदक के पास किसी प्रकार का राज्य होता है जो एक ही चीज़ को चलाने पर विफलता की संभावना बना देता है। पार्सर्स के लिए यह वह इनपुट है जो हर सफल मैच के साथ घट रहा है।

8

उदा। parsing के लिए ("उदाहरण के आधार पर आवेदक पार्सिंग" अनुभाग देखें)।

+2

मैं पारसेक से परिचित नहीं हूं। मैं कुछ स्पष्टीकरण की सराहना करता हूं। – missingfaktor

+2

जहां तक ​​मैं समझता हूं, यदि आपके पास एक्स के लिए पार्सर 'पी' है, तो 'कुछ पी' 0 या अधिक एक्स के लिए एक पार्सर है और' पी '1 या अधिक एक्स – Ingo

+2

@missingfaktor' के लिए एक पार्सर है 'और 'कई' को' <|> 'के संदर्भ में कार्यान्वित किया गया है। यह संयोजक अन्य तरीकों से भी उपयोगी है। 'या तो' पर विचार करें: 'बस 0 <|> बस 1 = बस 0',' कुछ भी नहीं <|> बस 2 = बस 2', 'बस 3 <|> कुछ भी नहीं = बस 3',' कुछ भी नहीं <|> कुछ भी नहीं = कुछ भी नहीं – fuz

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