के लिए बेहतर आवेदक उदाहरण मैं Brent Yorgey Haskell course के माध्यम से काम कर रहा हूं, और मुझे आवेदक के लिए एक अच्छा उदाहरण परिभाषित करने में समस्या हो रही है।पार्सर (हास्केल)
newtype Parser a = Parser { runParser :: String -> Maybe (a, String) }
समारोह एक स्ट्रिंग लेता है, इनपुट की एक निश्चित राशि को पार्स करता है, और एक हो सकता है कि टपल जहां पहले मूल्य पार्सर के प्रकार है देता है, और बाकी अन-पार्स शेष है: एक पार्सर इस प्रकार परिभाषित किया गया है स्ट्रिंग का
posInt :: Parser Integer
posInt = Parser f
where
f xs
| null ns = Nothing
| otherwise = Just (read ns, rest)
where (ns, rest) = span isDigit xs
काम पार्सर के लिए एक अनुप्रयोगी उदाहरण बनाने के लिए है: उदाहरण के लिए, इस धनात्मक पूर्णांक के लिए एक पार्सर है। हम एक functor उदाहरण (जो अपेक्षाकृत सीधी-सपाट है, मुझे लगता है) के साथ शुरू:
first :: (a -> b) -> (a,c) -> (b,c)
first f (a, c) = (f a, c)
instance Functor Parser where
fmap f p = Parser f'
where f' s = fmap (first f) $ (runParser p) s
और फिर मैं अनुप्रयोगी साथ मेरे हाथ की कोशिश की:
collapse (Just (Just a)) = Just a
collapse _ = Nothing
extract (Just a, Just b) = Just (a,b)
extract _ = Nothing
appliedFunc :: Parser (a->b) -> Parser a -> String -> Maybe (b, String)
appliedFunc p1 p2 str = extract (f <*> fmap fst result2, fmap snd result2)
where result1 = (runParser p1) str
f = fmap fst result1
result2 = collapse $ fmap (runParser p2) $ fmap snd result1
instance Applicative Parser where
pure a = Parser (\s -> Just (a, s))
p1 <*> p2 = Parser (appliedFunc p1 p2)
... छी। तो मेरा सवाल यह है कि, मैं अपना आवेदक उदाहरण क्लीनर कैसे पढ़ सकता हूं और पढ़ने में मुश्किल हो सकता हूं? मुझे लगता है कि इस सवाल के लिए एक आसान जवाब है, लेकिन मैं अभी तक अपने सिर को चारों ओर लपेटने में सक्षम नहीं हूं।
@AndrewC एक अभ्यास के लिए आप सही हो सकते हैं, लेकिन गेब्रियल गोंज़ालेज़ के उत्तर से संबंधित एक गहरी समस्या है: 'स्टेट टी' एक 'आवेदक' नहीं है जब तक कि 'एम' पूर्ण 'मोनाड' न हो। यह ट्रांसफार्मर के बीच बदलता है: 'हो सकता है कि एम' को एक पूर्ण 'मोनाड', 'रीडर टी' और 'राइटर टी' की आवश्यकता होती है, केवल 'आवेदक' की आवश्यकता होती है, जबकि 'कंट्रोल एम' प्रसिद्ध * मोनाड 'के साथ * पूर्ण * 'एम' पर आवश्यकताओं। –
गेब्रियल गोंज़ालेज़ के जवाब हमेशा उत्कृष्ट होते हैं, और मैंने पहले से ही उन्हें ऊपर उठाया था। यह मोनड ट्रांसफार्मर के लिए एक आकर्षक विज्ञापन है कि यह कोड इतना संक्षिप्त और स्पष्ट है। बेशक आप सही तरीके से इंगित करते हैं, मेरी टिप्पणी में त्रुटि उस स्तर पर थी जिसमें शामिल होने का स्तर था, जिससे मुझे कोई छोटा शर्मिंदगी नहीं मिली क्योंकि विशेष रूप से मैंने पहले एक अन्य प्रश्नकर्ता को समझाया था कि जब वे चाहते थे तो पार्सर के अंदर मोनाड क्यों जरूरी था केवल आवेदक का उपयोग करने के लिए! रवींद्र! – AndrewC