আমি বর্তমানে এমন একটি ফাংশন নিয়ে কাজ করছি যা এভাবে চলে:
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
। এবং / অথবা একটি দর্শন প্যাটার্ন / প্যাটার্ন প্রতিশব্দ। যদিও এর জন্য কিছু সহায়ক সহায়ক কোড লেখার প্রয়োজন।