مسیرها
/
F#
F#
/
تمرین‌ها
/
ترک روی ترک روی ترک
ترک روی ترک روی ترک

ترک روی ترک روی ترک

تمرین یادگیری

مقدمه

لیست

list در F# مجموعه‌ای تغییرناپذیر از صفر یا چند مقدار است. همه‌ی مقدارهای یک لیست باید نوع یکسانی داشته باشند. چون لیست تغییرناپذیر است، پس از ساخته شدنش، مقدارش هرگز تغییر نمی‌کند. هر تابع یا عملگری که به نظر برسد لیست را تغییر می‌دهد (مثلاً افزودن یک عنصر)، در واقع لیست جدیدی برمی‌گرداند.

لیست را می‌توان به این صورت تعریف کرد:

let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]

رایج‌ترین راه افزودن یک عنصر به لیست، استفاده از عملگر :: (cons) است:

let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]

هر لیست در F# یک سر (اولین عنصر) و یک دم (همه‌ی عنصرهای پس از عنصر اول) دارد. دم یک لیست خودش یک لیست است.

لیست یا با تابع‌ها و عملگرهای تعریف‌شده در ماژول List دستکاری می‌شود، یا به‌صورت دستی با تطبیق الگو با الگوهای list و cons:

let describe list =
    match list with
    | [] -> "Empty list"
    | head::tail -> sprintf "Non-empty list with head: %d" head

describe []        // => "Empty list"
describe [1]       // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"

همچنین می‌توانید هنگام تطبیق الگو یک مقدار را نادیده بگیرید؛ وقتی در یک حالت خاص به مقداری اهمیت نمی‌دهید (یعنی نمی‌خواهید از آن مقدار استفاده کنید)، می‌توانید برای نشان دادن این موضوع از زیرخط ('_') استفاده کنید:

let describe list =
    match list with
    | [] -> "Empty list"
    | [x] -> "List with one item"
    | [_; y] -> "List with two items (first item ignored)"
    | _ -> "List with many items (all items ignored)"

describe []        // => "Empty list"
describe [1]       // => "List with one item"
describe [5; 7]     // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"

'_' به‌تنهایی باید هنگام تطبیق الگو همیشه آخرین مورد باشد؛ هر مقداری که با هیچ‌یک از سایر حالت‌ها مطابقت نکند، با این حالت مدیریت می‌شود.

دستورالعمل‌ها

در این تمرین کدی می‌نویسید که فهرستی از زبان‌های برنامه‌نویسی را که می‌خواهید در Exercism یاد بگیرید، پیگیری کند.

شش کار دارید که همگی به کار با فهرست‌ها مربوط می‌شوند.

1. یک فهرست تازه بسازید

برای پیگیری زبان‌هایی که می‌خواهید یاد بگیرید، باید یک فهرست تازه بسازید. پیوند newList را تعریف کنید که دربردارنده‌ی یک فهرست تازه و خالی است.

newList
// => []

2. یک فهرست موجود را تعریف کنید

در حال حاضر، کاغذی دارید که زبان‌هایی را که می‌خواهید یاد بگیرید روی آن نوشته شده‌اند: F#، Clojure و Haskell. پیوند existingList را تعریف کنید تا این فهرست را نشان دهد.

existingList
// => ["F#"; "Clojure"; "Haskell"]

3. یک زبان تازه به فهرست اضافه کنید

همان‌طور که Exercism را کاوش می‌کنید و زبان‌های جالب‌تری پیدا می‌کنید، می‌خواهید آن‌ها را به فهرستتان اضافه کنید. تابع addLanguage را پیاده‌سازی کنید که یک زبان تازه را به ابتدای فهرست شما اضافه می‌کند.

addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]

4. زبان‌های فهرست را بشمارید

شمردن زبان‌ها یکی‌یکی کار راحتی نیست. تابع countLanguages را پیاده‌سازی کنید تا تعداد زبان‌های فهرست شما را بشمارد.

countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4

5. فهرست را برعکس کنید

یک جایی متوجه می‌شوید که فهرستتان در واقع برعکس مرتب شده است! تابع reverseList را پیاده‌سازی کنید تا فهرستتان را برعکس کند.

reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]

6. بررسی کنید که آیا فهرست هیجان‌انگیز است

هرچند همه‌ی زبان‌ها را دوست دارید، F# جایگاه ویژه‌ای در دل شما دارد. به همین دلیل، اگر شرایط زیر برقرار باشد، از یک فهرست زبان واقعاً هیجان‌زده می‌شوید:

  • اولین عنصر فهرست F# باشد.
  • دومین عنصر فهرست F# باشد و فهرست یا دو زبان داشته باشد یا سه زبان.

تابع excitingList را پیاده‌سازی کنید تا بررسی کند آیا یک فهرست زبان هیجان‌انگیز است:

excitingList ["Nim"; "F#"]
// => true
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
F# Exercism

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

در Exercism ثبت‌نام کنید تا F# را همراه با 18 مفهوم148 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.