ট্র্যাক
/
Roc
Roc
/
অনুশীলনী
/
অ্যারে অপারেশন
অ্যারে অপারেশন

অ্যারে অপারেশন

মধ্যম

নির্দেশনা

মৌলিক অ্যারে অপারেশন ইমপ্লিমেন্ট করুন।

ফাংশনাল ভাষায় length, map, ও reduce-এর মতো অ্যারে অপারেশন খুবই কমন। বিদ্যমান ফাংশন ব্যবহার না করেই একগুচ্ছ মৌলিক অ্যারে অপারেশন ইমপ্লিমেন্ট করুন।

বিদ্যমান নামের সঙ্গে সংঘর্ষ এড়াতে যে অপারেশনগুলো ইমপ্লিমেন্ট করা হবে তার সঠিক সংখ্যা ও নাম track-এর উপর নির্ভর করবে, তবে আপনি যে সাধারণ অপারেশনগুলো ইমপ্লিমেন্ট করবেন সেগুলো হলো:

  • append (দুটি অ্যারে দেওয়া হলে, দ্বিতীয় অ্যারের সব এলিমেন্ট প্রথম অ্যারের শেষে যোগ করুন);
  • concatenate (একগুচ্ছ অ্যারে দেওয়া হলে, সব অ্যারের সব এলিমেন্ট একত্র করে একটি সমতল অ্যারে বানান);
  • filter (একটি প্রেডিকেট ও একটি অ্যারে দেওয়া হলে, যেসব এলিমেন্টের জন্য predicate(item) ট্রু হয় সেসব এলিমেন্টের অ্যারে রিটার্ন করুন);
  • length (একটি অ্যারে দেওয়া হলে, তার ভেতরে থাকা এলিমেন্টের মোট সংখ্যা রিটার্ন করুন);
  • map (একটি ফাংশন ও একটি অ্যারে দেওয়া হলে, সব এলিমেন্টে function(item) প্রয়োগ করার ফলাফলগুলোর অ্যারে রিটার্ন করুন);
  • foldl (একটি ফাংশন, একটি অ্যারে এবং একটি প্রাথমিক অ্যাকুমুলেটর দেওয়া হলে, বাম দিক থেকে প্রতিটি এলিমেন্ট অ্যাকুমুলেটরে ফোল্ড (রিডিউস) করুন);
  • foldr (একটি ফাংশন, একটি অ্যারে এবং একটি প্রাথমিক অ্যাকুমুলেটর দেওয়া হলে, ডান দিক থেকে প্রতিটি এলিমেন্ট অ্যাকুমুলেটরে ফোল্ড (রিডিউস) করুন);
  • reverse (একটি অ্যারে দেওয়া হলে, মূল সব এলিমেন্ট নিয়ে একটি অ্যারে রিটার্ন করুন, তবে উল্টো ক্রমে)।

লক্ষ্য করুন, ফোল্ড ফাংশনগুলোতে (foldl, foldr) আর্গুমেন্ট যে ক্রমে পাঠানো হয় সেটি গুরুত্বপূর্ণ।

একটু দাঁড়ান, এটা তো অসম্ভব!

কোনো বিল্ট-ইন ফাংশন ব্যবহার না করে এই অ্যারে অপারেশনগুলো Roc-এ বাস্তবায়ন করা কার্যত অসম্ভব, কারণ অ্যারেতে নতুন এলিমেন্ট যোগ করতে বা সামনে যোগ করতে হলে আপনার একটা উপায় লাগবে। অন্য ভাষায় আপনি হয়তো Haskell-এ : বা Python-এ +=-এর মতো অপারেটর ব্যবহার করতেন, কিন্তু Roc-এ আপনাকে List ফাংশনগুলো ব্যবহার করতে হবে।

তাই এই অনুশীলনীতে আপনি List.append ব্যবহার করতে পারবেন (তবে অন্য কোনো বিল্ট-ইন ফাংশন ব্যবহার করা এড়িয়ে চলুন)।

অনেক ফাংশনাল প্রোগ্রামিং ভাষা প্রধান কালেকশন টাইপ হিসেবে লিংকড লিস্ট ব্যবহার করে। লিংকড লিস্টে নতুন এলিমেন্ট সামনে যোগ করা বা প্রথম এলিমেন্টটি বের করে নেওয়া বেশ দক্ষ, তাই সেই ভাষাগুলোতে আপনি List.prepend দিয়ে অ্যারে অপারেশনগুলো বাস্তবায়ন করতেন। কিন্তু Roc-এ একটি List হলো একটি অ্যারে (একটানা বাইটের একটি অংশ)। অ্যারের বৈশিষ্ট্য লিংকড লিস্টের চেয়ে আলাদা, যেমন ইনডেক্স দিয়ে দ্রুত এলিমেন্ট অ্যাক্সেস করা আর নতুন এলিমেন্ট যোগ করা। এই কারণেই Roc-এ আমরা প্রায়ই List.append ব্যবহার করি, আর List.prepend ব্যবহার করি খুব কমই।

নামকরণ

সাধারণ নির্দেশাবলিতে দেওয়া নামগুলোর চেয়ে Roc-এ কিছুটা আলাদা নাম ব্যবহার করা হয়:

  • append-এর বদলে concat
  • concatenate-এর বদলে join
  • length-এর বদলে len
  • foldl-এর বদলে fold
  • foldr-এর বদলে fold_rev

তবে Roc-এ নিচের ফাংশন নামগুলো স্ট্যান্ডার্ড:

  • filter
  • map
  • reverse

ইঙ্গিত

এভাবে চেষ্টা করে দেখুন:

match list {
    [] => ...
    [first, .. as rest] => ...
}

বা

match list {
    [] => ...
    [.. as rest, last] => ...
}
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Roc Exercism

অ্যারে অপারেশন শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Roc ট্র্যাকের 126টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।

ডিপ ডাইভ: অ্যারে অপারেশন!

রিকারশনের একটি ব্যবহারিক পরিচিতি উপভোগ করুন, অ্যারে অপারেশনের ইম্পারেটিভ ও ফাংশনাল বিকল্পগুলো ঘেঁটে দেখুন, আর টেল-কল রিকারশন ও অ্যাকুমুলেটর ফাংশনের গভীরে ডুব দিন।