مسیرها
/
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 از اسم‌هایی استفاده می‌کند که کمی با اسم‌های آمده در دستورالعمل‌های کلی تفاوت دارند:

  • concat به جای append
  • join به جای concatenate
  • len به جای length
  • fold به جای foldl
  • fold_rev به جای foldr

با این حال، اسم‌های توابع زیر در Roc استاندارد هستند:

  • filter
  • map
  • reverse

راهنمایی

این را امتحان کنید:

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

یا

match list {
    [] => ...
    [.. as rest, last] => ...
}
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Roc Exercism

آماده‌اید عملیات لیست را شروع کنید؟

در Exercism ثبت‌نام کنید تا Roc را همراه با 126 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق عملیات لیست!

از مقدمه‌ای عملی بر بازگشت لذت ببرید، جایگزین‌های دستوری و تابعی «عملیات لیست» را بررسی کنید و به بازگشت دنباله‌ای و توابع انباره عمیق شوید.