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 یاد بگیرید، پیگیری کند.
شش کار دارید که همگی به کار با فهرستها مربوط میشوند.
برای پیگیری زبانهایی که میخواهید یاد بگیرید، باید یک فهرست تازه بسازید. پیوند newList را تعریف کنید که دربردارندهی یک فهرست تازه و خالی است.
newList
// => []
در حال حاضر، کاغذی دارید که زبانهایی را که میخواهید یاد بگیرید روی آن نوشته شدهاند: F#، Clojure و Haskell. پیوند existingList را تعریف کنید تا این فهرست را نشان دهد.
existingList
// => ["F#"; "Clojure"; "Haskell"]
همانطور که Exercism را کاوش میکنید و زبانهای جالبتری پیدا میکنید، میخواهید آنها را به فهرستتان اضافه کنید. تابع addLanguage را پیادهسازی کنید که یک زبان تازه را به ابتدای فهرست شما اضافه میکند.
addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]
شمردن زبانها یکییکی کار راحتی نیست. تابع countLanguages را پیادهسازی کنید تا تعداد زبانهای فهرست شما را بشمارد.
countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4
یک جایی متوجه میشوید که فهرستتان در واقع برعکس مرتب شده است! تابع reverseList را پیادهسازی کنید تا فهرستتان را برعکس کند.
reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]
هرچند همهی زبانها را دوست دارید، F# جایگاه ویژهای در دل شما دارد. به همین دلیل، اگر شرایط زیر برقرار باشد، از یک فهرست زبان واقعاً هیجانزده میشوید:
تابع excitingList را پیادهسازی کنید تا بررسی کند آیا یک فهرست زبان هیجانانگیز است:
excitingList ["Nim"; "F#"]
// => true