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
।
पहले Maybe
। Nothing
का अर्थ विफलता है, इसलिए 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 f
f
बार-बार इसे फिर से चलने तक चलाएगा। मुझे यकीन नहीं है कि यह उपयोगी चीज है, लेकिन मुझे लगता है कि यह नहीं है।
तो, Maybe
, []
और STM
many
और some
के लिए जो उपयोगी हो करने के लिए नहीं है।यह केवल तभी उपयोगी होता है जब आवेदक के पास किसी प्रकार का राज्य होता है जो एक ही चीज़ को चलाने पर विफलता की संभावना बना देता है। पार्सर्स के लिए यह वह इनपुट है जो हर सफल मैच के साथ घट रहा है।
@ लांदेई: मैंने उस धागे में जवाब पढ़ा, और मुझे अभी भी यह नहीं मिला है। – missingfaktor
मैंने अभी कहा है कि यह प्रश्न एक डुप्लिकेट है, न कि मूल के पास एक अच्छा जवाब था :-) हालांकि यह मेरे लिए काफी अच्छा था: मुझे पता चला कि ये फ़ंक्शन मेरे लिए दिलचस्प नहीं हैं ... – Landei
@Landei: मैं आपके जैसा ही निष्कर्ष निकाल रहा हूं। :-) – missingfaktor