जीएनयू सप्टक इस कोड में -हास्केल रेपा - सरणी को कैसे कम करें और सूचकांक लौटाएं?
[e, ix] = min(X);
न्यूनतम तत्व वापस आ जाएगी और यह स्थान है। मनमाने ढंग से बाइनरी फ़ंक्शन के लिए रेपा में आप यह कैसे करते हैं? पुनरावृत्तियों की गणना के लिए एक (झ - हम दो एक्युमुलेटरों साथ (Data.List से) 'repa -1 डी मैट्रिक्स कन्वर्ट सूची और foldl उपयोग करने के लिए
min x = z $ foldl' f (e,0,0) es
where
(e:es) = toList x
f (a,ix,r) b = let ix' = ix+1 in if a < b then (a,ix',r) else (b,ix',ix')
z (a,ix,r) = (a,r)
ऊपर के उदाहरण में:
यह है कि मैं क्या लेकर आए हैं) और अन्य न्यूनतम तत्व (आर) की स्थिति को बचाने के लिए। लेकिन रेपा का उपयोग करने का पूरा बिंदु सरणी का उपयोग करना है, सूची नहीं!
रेपा में ऐरे प्रकार (फ़ोल्ड्स और फोल्डपी) के लिए दो गुना हैं - लेकिन वे केवल प्रकार (ए -> ए -> ए) का कार्य ले सकते हैं - यानी, मैं इसे जमाकर्ताओं के साथ ट्यूपल पास नहीं कर सकता। ,
min x = traverse x to0D min
where
to0D (Z:.i) = Z
min f (Z) = ??? -- how to get elements for comparison?
पहली बात यह है कि मन में आता है
[f (Z:.i) | i <- [1..n]], where n = (\(Z:.i) -> i) $ extent x
है लेकिन यह भी सरणी सूची में परिवर्तित कर देंगे: वहाँ भी पार है, जो, सिद्धांत रूप में, एक अदिश सरणी के लिए 1 डी सरणी कम कर सकते हैं सरणी पर गणना करने के बजाय।
वास्तव में रेपा से परिचित नहीं है, लेकिन क्या आप 'foldP?' का उपयोग करने से पहले प्रत्येक आइटम को टुपल पर मानचित्रित नहीं कर सकते हैं। उदाहरण के लिए, आप न्यूनतम तत्व के टुपल, न्यूनतम की अनुक्रमणिका और सबएरे की लंबाई का उपयोग करके एक उपैरे का वर्णन कर सकते हैं। तो आप प्रत्येक तत्व 'x' से '(x, 0, 1)' और फिर 'f (x, i, n) (y, j, m) = का उपयोग करते हुए समांतर गुना मैप करते हैं = यदि x
hammar
क्षमा करें, यह निश्चित रूप से 'maxBound' होना चाहिए। – hammar
एक tuple के साथ foldP का उपयोग करने के लिए आपको उन tuples के साथ सरणी होगी। यह किया जा सकता है, लेकिन यह छवि प्रसंस्करण (लाखों तत्वों) के लिए अपर्याप्त है। – EvgenijM86