तो समस्या यह है कि मैं किसी सूची में पैटर्न से मेल खाने पर काम कर रहा हूं, जैसे: match "abba" "redbluebluered" -> True
या match "abba" "redblueblue" -> False
, आदि। मैंने एक एल्गोरिदम लिखा जो काम करता है, और मुझे लगता है कि यह उचित समझ में आता है, लेकिन मुझे यकीन नहीं है अगर स्पष्ट रिकर्सन के बिना ऐसा करने का बेहतर तरीका है।क्या इस एल्गोरिदम में स्पष्ट रिकर्सन का उपयोग करने का कोई तरीका नहीं है?
import Data.HashMap.Strict as M
match :: (Eq a, Eq k, Hashable k) => [k] -> [a] -> HashMap k [a] -> Bool
match [] [] _ = True
match [] _ _ = False
match _ [] _ = False
match (p:ps) s m =
case M.lookup p m of
Just v ->
case stripPrefix v s of
Just post -> match ps post m
Nothing -> False
Nothing -> any f . tail . splits $ s
where f (pre, post) = match ps post $ M.insert p pre m
splits xs = zip (inits xs) (tails xs)
मैं इसे match "abba" "redbluebluered" empty
की तरह कॉल करूंगा। वास्तविक एल्गोरिदम सरल है। मानचित्र में पहले से मेल खाने वाले पैटर्न शामिल हैं। अंत में यह [ए -> "लाल", बी -> "नीला"] है। यदि अगला पैटर्न एक है जिसे हमने पहले देखा है, तो बस इसे मिलान करने का प्रयास करें और अगर हम कर सकते हैं तो रिकर्स करें। अन्यथा असफल हो जाते हैं और झूठी वापसी करते हैं।
यदि अगला पैटर्न नया है, तो स्ट्रिंग में प्रत्येक एकल उपसर्ग के लिए नए पैटर्न को मैप करने का प्रयास करें और रिकर्सिंग करें।
और एक सामान्य पार्सर समस्या की तरह, यहां आपको इनपुट को पूरी तरह से पार्स करने की आवश्यकता है। अंतिम दो पंक्तियों को संशोधित करें: '(असाइन, आर) <- प्राप्त करें; गार्ड $ आर == []; वापसी ' –
' अनुक्रम असाइन करता है। नक्शा एफ' 'mapM एफ' है – Cactus