Fsharp Array3 Fsharp Array3 Fsharp Array3
ایجاد آرایه ها با استفاده از توابع در #F
در این قسمت ایجاد آرایه ها با استفاده از توابع در #F روداریم.
ماژول آرایه چندین تابع را فراهم می کند که آرایه را از scratch ایجاد می کنند.
- تابع Array.empty یک آرایه خالی جدید ایجاد می کند.
- تابع Array.create آرایه ای از یک اندازه مشخص را ایجاد می کند و تمام عناصر را به مقادیر داده شده sets می کند.
- تابع Array.init یک آرایه ایجاد می کند، با توجه به ابعاد و تابع تولید عناصر.
- تابع Array.zeroCreate یک آرایه ایجاد می کند که در آن تمام عناصر به مقدار صفر مقدار دهی اولیه می شوند.
- تابع Array.copy یک آرایه جدید ایجاد می کند که شامل عناصری است که از یک آرایه موجود کپی می شود.
- تابع array.sub یک آرایه جدید را از زیر دامنه یا subrange یک آرایه تولید می کند.
- تابع Array.append آرایه جدیدی را با ترکیب دو آرایه موجود ایجاد می کند.
- تابع Array.choose عناصر آرایه را انتخاب می کند تا در آرایه جدید وارد شوند.
- تابع Array.collect یک تابع مشخص را در هر عنصر آرایه ای از یک آرایه موجود اجرا می کند و سپس عناصر تولید شده توسط تابع را جمع آوری می کند و آن ها را در یک آرایه جدید ترکیب می کند.
- تابع Array.concat یک توالی از آرایه ها را می گیرد و آن ها را به یک آرایه تک ترکیب می کند.
- تابع Array.filter یک تابع وضعیت بولین را می گیرد و یک آرایه جدید ایجاد می کند که فقط شامل آن عناصر از آرایه ورودی است که شرط true است.
- تابع Array.rev یک آرایه جدید را با معکوس کردن مرتبه آرایه موجود ایجاد می کند.
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | (* using create and set *) let array1 = Array.create 10 "" for i in 0 .. array1.Length - 1 do Array.set array1 i (i.ToString()) for i in 0 .. array1.Length - 1 do printf "%s " (Array.get array1 i) printfn " " (* empty array *) let array2 = Array.empty printfn "Length of empty array: %d" array2.Length let array3 = Array.create 10 7.0 printfn "Float Array: %A" array3 (* using the init and zeroCreate *) let array4 = Array.init 10 (fun index -> index * index) printfn "Array of squares: %A" array4 let array5 : float array = Array.zeroCreate 10 let (myZeroArray : float array) = Array.zeroCreate 10 printfn "Float Array: %A" array5 |
خروجی
1 2 3 4 5 | 0 1 2 3 4 5 6 7 8 9 Length of empty array: 0 Float Array: [|7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0|] Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|] Float Array: [|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|] |
مثال
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 | (* creating subarray from element 5 *) (* containing 15 elements thereon *) let array1 = [| 0 .. 50 |] let array2 = Array.sub array1 5 15 printfn "Sub Array:" printfn "%A" array2 (* appending two arrays *) let array3 = [| 1; 2; 3; 4|] let array4 = [| 5 .. 9 |] printfn "Appended Array:" let array5 = Array.append array3 array4 printfn "%A" array5 (* using the Choose function *) let array6 = [| 1 .. 20 |] let array7 = Array.choose (fun elem -> if elem % 3 = 0 then Some(float (elem)) else None) array6 printfn "Array with Chosen elements:" printfn "%A" array7 (*using the Collect function *) let array8 = [| 2 .. 5 |] let array9 = Array.collect (fun elem -> [| 0 .. elem - 1 |]) array8 printfn "Array with collected elements:" printfn "%A" array9 |
خروجی
1 2 3 4 5 6 7 8 | Sub Array: [|5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|] Appended Array: [|1; 2; 3; 4; 5; 6; 7; 8; 9|] Array with Chosen elements: [|3.0; 6.0; 9.0; 12.0; 15.0; 18.0|] Array with collected elements: [|0; 1; 0; 1; 2; 0; 1; 2; 3; 0; 1; 2; 3; 4|] |
جستجوی آرایه ها در #F
تابع Array.find یک تابع بولین را دریافت می کند و عنصر اول را باز می گرداند برای این که تابع true را بازگرداند، در غیر این صورت KeyNotFoundException نیز به وجود می آید.
تابع Array.findIndex به طور مشابه عمل می کند به جز اینکه ایندکس عنصر را به جای خود عنصر باز می گرداند.
مثال زیر این را نشان می دهد.
مایکروسافت این مثال برنامه جالب را ارائه می دهد که اولین عنصر را در محدوده عدد داده شده، مشخص است که هر دو مربع کامل و همچنین یک مکعب کامل است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let array1 = [| 2 .. 100 |] let delta = 1.0e-10 let isPerfectSquare (x:int) = let y = sqrt (float x) abs(y - round y) < delta let isPerfectCube (x:int) = let y = System.Math.Pow(float x, 1.0/3.0) abs(y - round y) < delta let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1 let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1 printfn "The first element that is both a square and a cube is %d and its index is %d." element index |
خروجی
1 | The first element that is both a square and a cube is 64 and its index is 62. |