سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. برای تعریف لیست در #F فقط کافیست از [] و برای جداسازی آیتمهای موجود در لیست از عملگر :: (بخوانید cons) استفاده کنید. در این بخش ایجاد و آماده سازی Lists در #F رو در سه جلسه خواهیم داشت. در ادامه انواع لیست ها و خصوصیات آن ها از جمله خصوصیات List Data Type در #F رو بررسی می نماییم.
Lists در #F یک سری از عناصر مرتب شده و غیر قابل تغییر از همان نوع است. این تا حدودی معادل ساختار linked list data است.
ماژول F #، Microsoft.FSharp.Collections.List، عملیات مشترک در Lists ها دارد. با این حال #F این ماژول را به صورت خودکار وارد می کند و باعث می شود که هر برنامه #F قابل دسترسی باشد.
در زیر راه های مختلف ایجاد لیست آمده است.
در این روش، شما فقط توالی مقادیر محدوده ی سیمیکالن را در محیط براکت مشخص می کنید .
به عنوان مثال
1 | let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] |
با استفاده از این روش، می توانید برخی از مقادیر را به صورت پیش فرض یا با منصوب کردن آن به لیست موجود با استفاده از عملگر (::) cons اضافه کنید.
به عنوان مثال
1 | let list2 = 1::2::3::4::5::6::7::8::9::10::[];; |
[] یک لیست خالی را نشان می دهد.
روش 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 ساختار سینتکس های خاص 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] |
ویژگی | نوع | توضیحات |
---|---|---|
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)) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.(خصوصیات List Data Type در #F)
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 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) را محاسبه می کند). |
ادامه مبحث Lists در #F رو در جلسه بعد خواهیم داشت.
در بخش اول ایجاد و آماده سازی Lists در #F به بیان انواع لیست ها، خصوصیات List Data Type در #F ، عملگرهای پایه در List، استفاده از عملگر (::) cons و…پرداختیم. در جلسه بعد این مبحث رو ادامه خواهیم داد.