मुझे ट्रांसफॉर्मेशन को एक सबएरे में बदलने की आवश्यकता है, और इसे उपराय के उप-उपरोक्त में परिवर्तन करने की आवश्यकता हो सकती है।हास्केल में सरणी संशोधित करना और इंडेक्स को याद करना
क्या हास्केल में ऐसा करने के सहज तरीके हैं, जैसे कि उपरायरे को परिभाषित करना या ऐसा कुछ? मैंने "हैकेल के लिए एक सौम्य परिचय" में सरणी पर अनुभाग पढ़ा है, और यह इसे संबोधित नहीं करता है, और मुझे इसे करने का एक तरीका खोजने में कठिन समय है।
यह हंगरी एल्गोरिदम के कार्यान्वयन के लिए है जैसा कि विकिपीडिया पर here वर्णित है।
तो अब तक मैंने किया है निम्नलिखित:
import Array
step1 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step1 a = a // [ ((i,j), f (i,j)) | (i,j) <- range (bounds a) ] where
f (i,j) = a!(i,j) - minRow i
minRow i = minimum [ a!(i,j) | j <- [1..(snd . snd . bounds) a] ]
step2 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step2 a = a // [ ((i,j), f (i,j)) | (i,j) <- range (bounds a) ] where
f (i,j) = a!(i,j) - minCol j
minCol j = minimum [ a!(i,j) | i <- [1..(fst . snd . bounds) a] ]
समस्या मैं कैसे कदम 3 और 4, जो एक submatrix पर प्रक्रिया जारी है को लागू करने के मामले में एक समाधान है पता नहीं है कि है आसानी से उपलब्ध नहीं है।
हैकेज पर कुछ नमूना कोड है जो मदद कर सकता है, http://hackage.haskell.org/packages/archive/Munkres/0.1/doc/html/src/Data-Algorithm-Munkres.html#hglishMethodInt –
वहां है यहां बहुत सारे कोड हैं जो मैं वास्तव में समझ में नहीं आता हूं। उदाहरण के लिए, '@' ऑपरेटर को कैसे परिभाषित किया जाता है? इसका उपयोग 'xxs @ (x: xs)' जैसे अभिव्यक्तियों में लगभग हर दूसरी पंक्ति में किया जाता है। – Undreren
'@' ऑपरेटर का उपयोग पैटर्न से मेल खाने वाले घटकों को नाम देने के लिए किया जाता है। इसका अर्थ यह है कि 'xxs' का मिलान किया जा सकता है जो '(x: xs)' –