Fsharp Lists 3 Fsharp Lists 3 Fsharp Lists 3
جدول عملگرهای پایه List در #F
مقدار | توضیحات |
tryFindIndex : (‘T → bool) → ‘T list → int option | ایندکس اولین عنصر در فهرست را بازخوانی می کند که پیش فرض داده شده را برآورده می کند. اگر چنین عنصر وجود نداشته باشد، None را باز می گرداند. |
tryPick : (‘T → ‘U option) → ‘T list → ‘U option | تابع داده شده را به عناصر متوالی اعمال می کند، اولین نتیجه را باز می گرداند که در آن تابع Some را برای برخی از مقادیر به ارمغان می آورد. اگر چنین عنصر وجود نداشته باشد، None را برمی گرداند. |
unzip : (‘T1 * ‘T2) list → ‘T1 list * ‘T2 list | لیستی از جفت ها را به دو لیست تقسیم می کند. |
unzip3 : (‘T1 * ‘T2 * ‘T3) list → ‘T1 list * ‘T2 list * ‘T3 list | یک لیست سه تایی را به سه لیست تقسیم می شود. |
zip : ‘T1 list → ‘T2 list → (‘T1 * ‘T2) list | این دو لیست را در یک لیست دوگانه ترکیب می کند. این دو لیست باید طول برابر داشته باشند. |
zip3 : ‘T1 list → ‘T2 list → ‘T3 list → (‘T1 * ‘T2 * ‘T3) list | این سه لیست را در یک لیست سه گانه ترکیب می کند. لیست ها باید با هم برابر باشند. |
مثال های زیر استفاده از ویژگی های فوق و جدول های دو جلسه قبل را نشان می دهد .
مثال
این برنامه بازگشت یک لیست به صورت بازگشتی را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 | let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ] printfn "The original list: %A" list1 let reverse lt = let rec loop acc = function | [] -> acc | hd :: tl -> loop (hd :: acc) tl loop [] lt printfn "The reversed list: %A" (reverse list1) |
خروجی
1 2 | The original list: [2; 4; 6; 8; 10; 12; 14; 16] The reversed list: [16; 14; 12; 10; 8; 6; 4; 2] |
با این حال، شما می توانید برای همین هدف از تابع rev از ماژول استفاده کنید .
1 2 3 | let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ] printfn "The original list: %A" list1 printfn "The reversed list: %A" (List.rev list1) |
خروجی
1 2 | The original list: [2; 4; 6; 8; 10; 12; 14; 16] The reversed list: [16; 14; 12; 10; 8; 6; 4; 2] |
مثال
این برنامه فیلتر کردن یک لیست را با استفاده از روش List.filter در #F نشان می دهد.
1 2 3 4 | let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] printfn "The list: %A" list1 let list2 = list1 |> List.filter (fun x -> x % 2 = 0);; printfn "The Filtered list: %A" list2 |
خروجی
1 2 | The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] The Filtered list: [2; 4; 6; 8; 10] |
بعد از مثال فیلتر کردن یک لیست را با استفاده از روش List.filter در #F سراغ مثال دیگری می رویم.
مثال
روش List.map یک لیست از یک نوع را به دیگری نشان می دهد.
1 2 3 4 | let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] printfn "The list: %A" list1 let list2 = list1 |> List.map (fun x -> (x * x).ToString());; printfn "The Mapped list: %A" list2 |
خروجی
1 2 | The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] The Mapped list: ["1"; "4"; "9"; "16"; "25"; "36"; "49"; "64"; "81"; "100"] |
مثال
متد List.append و اپراتور @ یک لیست را به دیگری اضافه می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let list1 = [1; 2; 3; 4; 5 ] let list2 = [6; 7; 8; 9; 10] let list3 = List.append list1 list2 printfn "The first list: %A" list1 printfn "The second list: %A" list2 printfn "The appened list: %A" list3 let lt1 = ['a'; 'b';'c' ] let lt2 = ['e'; 'f';'g' ] let lt3 = lt1 @ lt2 printfn "The first list: %A" lt1 printfn "The second list: %A" lt2 printfn "The appened list: %A" lt3 |
خروجی
1 2 3 4 5 6 | The first list: [1; 2; 3; 4; 5] The second list: [6; 7; 8; 9; 10] The appened list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] The first list: ['a'; 'b'; 'c'] The second list: ['e'; 'f'; 'g'] The appened list: ['a'; 'b'; 'c'; 'e'; 'f'; 'g'] |
مثال
روش List.sort لیستی را مرتب می کند( مرتب سازی با List.sort در #F ).
روش List.sum مجموع عناصر در لیست را می دهد.
و روش List.average متوسط عناصر در لیست را می دهد.
1 2 3 4 5 6 7 8 9 10 | let list1 = [9.0; 0.0; 2.0; -4.5; 11.2; 8.0; -10.0] printfn "The list: %A" list1 let list2 = List.sort list1 printfn "The sorted list: %A" list2 let s = List.sum list1 let avg = List.average list1 printfn "The sum: %f" s printfn "The average: %f" avg |
خروجی
1 2 3 4 | The list: [9.0; 0.0; 2.0; -4.5; 11.2; 8.0; -10.0] The sorted list: [-10.0; -4.5; 0.0; 2.0; 8.0; 9.0; 11.2] The sum: 15.700000 The average: 2.242857 |
عملیات “fold” یک تابع را برای هر عنصر در یک لیست اعمال می کند، نتیجه تابع را در یک متغیر accumulator جمع می کند و accumulator را به عنوان نتیجه عملیات بازمی گرداند.
مثال
روش List.fold تابع را به هر عنصر از چپ به راست اعمال می کند، در حالی که List.foldBack یک تابع را برای هر عنصر از راست به چپ اعمال می کند.
1 2 | let sumList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Sum of the elements of list %A is %d." [ 1 .. 10 ] (sumList [ 1 .. 10 ]) |
خروجی
1 | Sum of the elements of list [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] is 55. |