मैं वर्तमान में एक फ़ंक्शन के साथ काम कर रहा हूं जो इस प्रकार है:
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
दूसरे शब्दों में, एक सूची दी गई है, यह किसी चीज़ के लिए पहले छह तत्वों का उपयोग करता है, और यदि सूची छह तत्वों से कम लंबी है, तो यह defलापता लोगों के लिए स्टैंड-इन के रूप में उपयोग करता है। यह कुल है, लेकिन इसके टुकड़े (जैसे नहीं map fromJust . filter isJust) हैं, इसलिए मुझे यह पसंद नहीं है। मैंने इसे फिर से लिखने की कोशिश की ताकि इसे किसी भी पक्षपात का उपयोग करने की आवश्यकता न हो, और यह मिल गया:
foo [] = foobar def def def def def def
foo [a] = foobar a def def def def def
foo [a,b] = foobar a b def def def def
foo [a,b,c] = foobar a b c def def def
foo [a,b,c,d] = foobar a b c d def def
foo [a,b,c,d,e] = foobar a b c d e def
foo (a:b:c:d:e:f:_) = foobar a b c d e f
मैंने तकनीकी रूप से वही किया जो मैं चाहता हूं, लेकिन अब यह एक विशाल गड़बड़ है। मैं इसे और अधिक सुरुचिपूर्ण और कम दोहरावदार तरीके से कैसे कर सकता हूं?
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...काफी स्थानीय है कि मैं दो बार सिर्फ इसका उपयोग करने के बारे में नहीं सोचूंगा और सभी अतिरिक्त मशीनों को छोड़ दूंगा जो मौजूदा उत्तर पेश कर रहे हैं। यह आम तौर पर अधिक वैश्विक समग्रता तर्क है (जिसमें कई फ़ंक्शन कॉल में बनाए गए इनवेरिएंट शामिल हैं, जैसे) जो मुझे परेशान करते हैं।
takeWithDefमें अगर यह एक नियमित सूची देता है, तो यह प्रयोग करने योग्य नहीं है, क्योंकि हमें मिलान करने की आवश्यकता है कि: - / उचित समाधान वह है जो डैनियल ने अपने दूसरे उत्तर में नीचे लिखा है। unconsकेवल पहला तत्व मिलता है, इसलिए यह उतना उपयोगी नहीं है।
uncons :: Default a => [a] -> (a,[a])जो एक चूक लिखोdef। या एक चूकtakeWithDef। और / या एक दृश्य पैटर्न / पैटर्न पर्यायवाची। हालांकि इसके लिए कुछ सहायक सहायक कोड लिखना पड़ता है।