मैं समझने की कोशिश कर रहा हूं कि Select
मोनैड कैसे काम करता है। जाहिर है, यह Cont
का चचेरा भाई है और इसका उपयोग बैकट्रैकिंग खोज के लिए किया जा सकता है।एन-क्वींस को हल करने के लिए मोनाड का चयन कैसे करें?
-- All the ways of extracting an element from a list.
oneOf :: [Int] -> [(Int,[Int])]
oneOf [] = []
oneOf (x:xs) = (x,xs) : map (\(y,ys) -> (y,x:ys)) (oneOf xs)
-- Adding a new queen at col x, is it threathened diagonally by any of the
-- existing queens?
safeDiag :: Int -> [Int] -> Bool
safeDiag x xs = all (\(y,i) -> abs (x-y) /= i) (zip xs [1..])
nqueens :: Int -> [[Int]]
nqueens queenCount = go [] [1..queenCount]
where
-- cps = columsn of already positioned queens.
-- fps = columns that are still available
go :: [Int] -> [Int] -> [[Int]]
go cps [] = [cps]
go cps fps = [ps | (p,nfps) <- oneOf fps, ps <- go (p:cps) nfps, safeDiag p cps]
मैं बजाय Select
उपयोग करने के लिए इस समाधान अनुकूल करने के लिए संघर्ष कर रहा हूँ:
मैं एन क्वीन्स समस्या के लिए इस सूची के आधार पर समाधान है।
ऐसा लगता है कि Select
आपको "मूल्यांकन फ़ंक्शन" पर सार देता है जिसका उपयोग उत्तर की तुलना करने के लिए किया जाता है। यह कार्य runSelect
पर पारित किया गया है। मुझे लगता है कि मेरे समाधान में safeDiag
जैसे कुछ मूल्यांकन समारोह के रूप में काम कर सकते हैं, लेकिन Select
गणना स्वयं को कैसे व्यवस्थित करें?
इसके अलावा, क्या Select
अकेले मोनैड का उपयोग करने के लिए पर्याप्त है, या क्या मुझे सूचियों पर ट्रांसफॉर्मर संस्करण का उपयोग करने की आवश्यकता है?
क्या आप वाकई 'चयन' मोनैड चाहते हैं? 'चयन' की मेरी समझ यह है कि यह एक संभावित समाधान (गवाह प्रमाण के रूप में) के अस्तित्व को साबित करने का प्रयास करता है। 'चयन' का सामान्य उदाहरण एक एसएटी सॉल्वर है। आप सूची मोनैड पर 'सिलेक्ट टी' के साथ कुछ बल दे सकते हैं, लेकिन मुझे यकीन है कि आप वास्तव में चुनिंदा मोनड का उपयोग करेंगे। – Alec
@Alec मैंने पढ़ा कि 'चयन' बैकट्रैकिंग खोज के लिए अच्छा था, और एन-क्वींस उस प्रकार की एक मूलभूत समस्या है, इसलिए मुझे लगता है कि यह मोनड के लिए एक अच्छा उपयोग मामला था। – danidiaz
भेदभाव समाधान मिलने तक सभी समाधानों और बैकट्रैकिंग को खोजने के लिए बैकट्रैकिंग के बीच हो सकता है। फिर फिर, मैंने केवल एक बार पहले 'चयन' के साथ खेला है, इसलिए मैं कुछ भी गंभीरता से नहीं लेता हूं। – Alec