Fsharp Lists 1 Fsharp Lists 1 Fsharp Lists 1
Lists در #F
Lists در #F یک سری از عناصر مرتب شده و غیر قابل تغییر از همان نوع است. این تا حدودی معادل ساختار linked list data است.
ماژول F #، Microsoft.FSharp.Collections.List، عملیات مشترک در Lists ها دارد. با این حال #F این ماژول را به صورت خودکار وارد می کند و باعث می شود که هر برنامه #F قابل دسترسی باشد.
ایجاد و آماده سازی Lists در #F
در زیر راه های مختلف ایجاد لیست آمده است.
- استفاده از list literals
- استفاده از عملگر (::) cons
- با استفاده از روش init از List module.
- با استفاده از ساختارهای syntactic به نام List Comprehensions.
استفاده از list literals در #F
در این روش، شما فقط توالی مقادیر محدوده ی سیمیکالن را در محیط براکت مشخص می کنید .
مثال
1 | let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] |
استفاده از عملگر (::) cons در #F
با استفاده از این روش، می توانید برخی از مقادیر را به صورت پیش فرض یا با منصوب کردن آن به لیست موجود با استفاده از عملگر (::) cons اضافه کنید.
مثال
1 | let list2 = 1::2::3::4::5::6::7::8::9::10::[];; |
[] یک لیست خالی را نشان می دهد.
متد List init در #F
روش list.init از ماژول List اغلب برای ایجاد List استفاده می شود.
1 | val init : int -> (int -> 'T) -> 'T list |
اولین آرگومان طول مورد نظر در لیست جدید است و دومین آرگومان یک تابع initializer است که عناصر را در لیست تولید می کند.
مثال
1 | let list5 = List.init 5 (fun index -> (index, index * index, index * index * index)) |
در این جا، تابع index لیست را تولید می کند.
List Comprehensions در #F
List Comprehensions ساختار سینتکس های خاص generating lists هستند.
سینتکس list comprehension در #F به دو فرم است. ranges و generators.
ranges ساختار [start .. end] و [start .. step .. end] را دارد.
مثال
1 | let list3 = [1 .. 10] |
generators دارای ساختار [for x in collection do … yield expr] هستند.
مثال
1 | let list6 = [ for a in 1 .. 10 do yield (a * a) ] |
همانطور که کلمات کلیدی yield یک مقدار واحد را به یک لیست می برد، کلمه کلیدی، !yield یک مجموعه ای از مقادیر را به لیست فشار می دهد.
تابع زیر روش های فوق را نشان می دهد .
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | (* using list literals *) let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] printfn "The list: %A" list1 (*using cons operator *) let list2 = 1 :: 2 :: 3 :: [] printfn "The list: %A" list2 (* using range constructs*) let list3 = [1 .. 10] printfn "The list: %A" list3 (* using range constructs *) let list4 = ['a' .. 'm'] printfn "The list: %A" list4 (* using init method *) let list5 = List.init 5 (fun index -> (index, index * index, index * index * index)) printfn "The list: %A" list5 (* using yield operator *) let list6 = [ for a in 1 .. 10 do yield (a * a) ] printfn "The list: %A" list6 (* using yield operator *) let list7 = [ for a in 1 .. 100 do if a % 3 = 0 && a % 5 = 0 then yield a] printfn "The list: %A" list7 (* using yield! operator *) let list8 = [for a in 1 .. 3 do yield! [ a .. a + 3 ] ] printfn "The list: %A" list8 |
خروجی
1 2 3 4 5 6 7 8 | The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] The list: [1; 2; 3] The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] The list: ['a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'i'; 'j'; 'k'; 'l'; 'm'] The list: [(0, 0, 0); (1, 1, 1); (2, 4, 8); (3, 9, 27); (4, 16, 64)] The list: [1; 4; 9; 16; 25; 36; 49; 64; 81; 100] The list: [15; 30; 45; 60; 75; 90] The list: [1; 2; 3; 4; 2; 3; 4; 5; 3; 4; 5; 6] |
خصوصیات List Data Type در #F
ویژگی | نوع | توضیحات |
Head | T’ | اولین عنصر است. |
Empty | T list’ | یک ویژگی استاتیک که یک لیست خالی از نوع مناسب را نشان می دهد. |
IsEmpty | bool | true است اگر لیست هیچ عنصر نداشته باشد. |
Item | T’ | عنصر در index مشخص شده (zero-based). |
Length | int | تعداد عناصر |
Tail | T list’ | لیست بدون عنصر اول |
مثال زیر استفاده از این خواص را نشان می دهد .(خصوصیات List Data Type در #F)
1 2 3 4 5 6 7 8 9 | let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ] // Use of Properties printfn "list1.IsEmpty is %b" (list1.IsEmpty) printfn "list1.Length is %d" (list1.Length) printfn "list1.Head is %d" (list1.Head) printfn "list1.Tail.Head is %d" (list1.Tail.Head) printfn "list1.Tail.Tail.Head is %d" (list1.Tail.Tail.Head) printfn "list1.Item(1) is %d" (list1.Item(1)) |
خروجی
1 2 3 4 5 6 | list1.IsEmpty is false list1.Length is 8 list1.Head is 2 list1.Tail.Head is 4 list1.Tail.Tail.Head is 6 list1.Item(1) is 4 |
پس از خصوصیات List Data Type در #F به عملگرهای پایه در List می پردازیم.
عملگرهای پایه در List در #F
جدول زیر اعمال اساسی را در list data type نشان می دهد.
مقدار | توضیحات |
append : ‘T list → ‘T list → ‘T list | یک لیست جدید را که حاوی عناصر اول فهرست همراه عناصر دوم است، بازمی گرداند. |
average : ‘T list → ^T | میانگین عناصر موجود در لیست را بازمیگرداند. |
averageBy : (‘T → ^U) → ‘T list → ^U | میانگین عناصر ایجاد شده توسط اعمال تابع به هر عنصر لیست را بازمی گرداند. |
choose : (‘T → ‘U option) → ‘T list → ‘U list | تابع داده شده را به هر عنصر لیست اعمال می کند. لیستی شامل نتایج هر عنصر که تابع برخی از آن ها را باز می گرداند، برمی گرداند. |
collect : (‘T → ‘U list) → ‘T list → ‘U list | برای هر عنصر از لیست، تابع داده شده اعمال می شود. همه نتایج را به هم پیوند می دهد و لیست ترکیبی را باز می گرداند. |
concat : seq<‘T list> → ‘T list | لیست جدیدی را که حاوی عناصر هر لیست به ترتیب است، بازگرداند. |
empty : ‘T list | یک لیست خالی از نوع داده را نشان می دهد. |
exists : (‘T → bool) → ‘T list → bool | تست می کند، اگر هر عنصر از لیست منطبق با مفروض داده شده است. |
exists2 : (‘T1 → ‘T2 → bool) → ‘T1 list → ‘T2 list → bool | تست می کند ،اگر هر جفت عناصر متناظر از لیست ها منطبق با پیش فرض داده شده باشد. |
filter : (‘T → bool) → ‘T list → ‘T list | یک مجموعه جدید که شامل فقط عناصر مجموعه است را بازمی گرداند که پیش فرض قرار داده شده true را باز گرداند. |
find : (‘T → bool) → ‘T list → ‘T | اولین عنصر را بازمی گرداند که تابع داده شده true باشد. |
findIndex : (‘T → bool) → ‘T list → int | index اولین عنصر در لیست را برمی گرداند که منطق داده شده را ارضا می کند. |
fold : (‘State → ‘T → ‘State) → ‘State → ‘T list → ‘State | یک تابع را برای هر عنصر مجموعه اعمال می کند،آرگومان accumulator را از طریق محاسبات تریدینگ می کند. این تابع آرگومان دوم را می گیرد و تابع را به آن اعمال می کند و اولین عنصر از لیست است.سپس، این نتیجه را به تابع همراه با عنصر دوم منتقل می کند و غیره. در نهایت، نتیجه نهایی را برمی گرداند. اگر تابع ورودی f باشد و عناصر i0 … iN باشد، این تابع f (… f s i0) i1 …) iN را محاسبه می کند. |
fold2 : (‘State → ‘T1 → ‘T2 → ‘State) → ‘State → ‘T1 list → ‘T2 list → ‘State | یک تابع به عناصر مربوطه از دو مجموعه اعمال می شود، یک آرگومان accumulator را از طریق محاسبات تریدینگ می کند. مجموعه ها باید اندازه های یکسان داشته باشند. اگر تابع ورودی f است و عناصر i0 … iN و j0 … jN، سپس این تابع f (… (f s i0 j0) …) iN jN را محاسبه می کند. |
foldBack : (‘T → ‘State → ‘State) → ‘T list → ‘State → ‘State | یک تابع را برای هر عنصر مجموعه اعمال می کند، آرگومان accumulator را از طریق محاسبات تریدینگ می کند. اگر تابع ورودی isf و عناصر i0 … iN باشد، سپس f i0 (…(f iN s)) محاسبه می شود. |
foldBack2 : (‘T1 → ‘T2 → ‘State → ‘State) → ‘T1 list → ‘T2 list → ‘State → ‘State | یک تابع به عناصر مربوطه از دو مجموعه اعمال می شود، یک آرگومان accumulator را از طریق محاسبات تریدینگ می کند. مجموعه ها باید اندازه های یکسان داشته باشند. اگر تابع ورودی f باشد و عناصر i0 … iN و j0 … jN باشد، این تابع f i0 j0 (… (f iN jN s) را محاسبه می کند). |