سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. در این قسمت از آموزش کار با توابع در #F رو بررسی خواهیم نمود. انواع تابع و چگونگی فراخوانی یک تابع در #F رو در ادامه خواهیم داشت.
در #F ، توابع مانند انواع داده کار می کنند. شما می توانید یک تابع را به همان شیوه مانند هر متغیر دیگری اعلان و استفاده کنید.
از آن جا که توابع می توانند مانند هر متغیر دیگری استفاده شوند، می توانید:
در این قسمت از کار با توابع در #F تعریف تابع رو داریم.
توابع با استفاده از کلید واژه let تعریف می شوند. تعریف تابع دارای سینتکس زیر است .( توابع در #F )
1 2 | let [inline] function-name parameter-list [ : return-type ] = function-body |
جایی که،
نام پارامترها را باید درست بعد از نام تابع لیست کنید. شما می توانید نوع یک پارامتر را مشخص کنید. نوع پارامتر باید همراه با نام پارامتر که توسط یک دو نقطه جدا شده دنبال شود.
اگر هیچ نوع پارامتری مشخص نشده باشد، توسط کامپایلر استنباط خواهد شد.
به عنوان مثال
1 | let doubleIt (x : int) = 2 * x |
یک تابع توسط مشخص کردن نام تابع و سپس یک space فراخوانی می شود و سپس هر آرگومانی که با space جدا شده است.
مثال برای فراخوانی یک تابع در #F
1 | let vol = cylinderVolume 3.0 5.0 |
برنامه های زیر مفاهیم را نشان می دهند.
برنامه زیر حجم استوانه را محاسبه می کند زمانی که شعاع و طول به عنوان پارامتر داده می شود.
1 2 3 4 5 6 7 8 9 10 11 | // the function calculates the volume of // a cylinder with radius and length as parameters let cylinderVolume radius length : float = // function body let pi = 3.14159 length * pi * radius * radius let vol = cylinderVolume 3.0 5.0 printfn " Volume: %g " vol |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | Volume: 141.372 |
برنامه زیر مقدار بزرگتری از دو پارامتر داده شده را باز می گرداند.( فراخوانی یک تابع در #F )
1 2 3 4 5 6 7 8 9 10 11 12 | // the function returns the larger value between two // arguments let max num1 num2 : int32 = // function body if(num1>num2)then num1 else num2 let res = max 39 52 printfn " Max Value: %d " res |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | Max Value: 52 |
1 2 | let doubleIt (x : int) = 2 * x printfn "Double 19: %d" ( doubleIt(19)) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | Double 19: 38 |
توابع بازگشتی توابعی هستند که خود را فراخوانی می کنند.
شما با استفاده از ترکیب کلید واژه let rec می توانید توابع بازگشتی یا Recursive را تعریف می کنید.
سینتکس تعریف یک تابع بازگشتی را در زیر می بینیم.
1 2 | //Recursive function definition let rec function-name parameter-list = recursive-function-body |
برای مثال
1 | let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) |
برنامه زیر فیبوناچی ۱ تا ۱۰ را باز می گرداند.
1 2 3 | let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) for i = 1 to 10 do printfn "Fibonacci %d: %d" i (fib i) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 5 6 7 8 9 10 | Fibonacci 1: 1 Fibonacci 2: 2 Fibonacci 3: 3 Fibonacci 4: 5 Fibonacci 5: 8 Fibonacci 6: 13 Fibonacci 7: 21 Fibonacci 8: 34 Fibonacci 9: 55 Fibonacci 10: 89 |
برنامه زیر فاکتوریل ۸ را باز می گرداند.
1 2 3 4 5 | open System let rec fact x = if x < 1 then 1 else x * fact (x - 1) Console.WriteLine(fact 8) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 40320 |
#F در مورد نوع داده ها در توابع و مقادیر آن ها، با استفاده از نماد arrow-پیکان گزارش می دهد. بگذارید یک نمونه از یک تابع را بگیریم که یک ورودی int را می گیرد و یک رشته را برمی گرداند. با نماد arrow، آن به صورت زیر نوشته شده است.
1 | int -> string |
انواع داده ها از چپ به راست خوانده می شوند.
اجازه دهید یک تابع فرضی دیگر بگیریم که دو ورودی داده int را می گیرد و یک رشته را باز می گرداند.
1 | let mydivfunction x y = (x / y).ToString();; |
#F نوع داده را با استفاده از نشانه فلش زنجیره ای نشان می دهد.
1 | val mydivfunction : x:int -> y:int -> string |
نوع بازگشت در راست ترین سمت با فلش زنجیره ای نشان داده شده است.
بعضی نمونه های دیگر
نشانه | معنی |
---|---|
float → float → float | این تابع دو ورودی شناور را می گیرد، شناور دیگری را باز می گرداند. |
int → string → float | این تابع یک int و یک ورودی string را می گیرد، یک شناور یا float را باز می گرداند. |
یک عبارت Lambda یک تابع بدون نام است.
اجازه دهید نمونه ای از دو توابع را به دست آوریم.
1 2 3 4 | let applyFunction ( f: int -> int -> int) x y = f x y let mul x y = x * y let res = applyFunction mul 5 7 printfn "%d" res |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 35 |
حالا در مثال فوق، اگر به جای تعریف تابع mul، ما می توانستیم عبارات Lambda را استفاده نماییم مانند مثال زیر
1 2 3 | let applyFunction ( f: int -> int -> int) x y = f x y let res = applyFunction (fun x y -> x * y ) 5 7 printfn "%d" res |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 35 |
در #F ، یک تابع می تواند از سایر توابع تشکیل شود.
مثال زیر ترکیبی از یک تابع به نام f را نشان می دهد،که از دو تابع function1 و function2 تشکیل شده است.
1 2 3 4 5 6 | let function1 x = x + 1 let function2 x = x * 5 let f = function1 >> function2 let res = f 10 printfn "%d" res |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 55 |
#F ویژگی ای به نام pipelining توابع را نیز فراهم می کند. Pipelining اجازه می دهد تا فراخوانی توابع به عنوان عملیات متوالی به هم متصل شوند.
مثال زیر این را نشان می دهد.
1 2 3 4 5 | let function1 x = x + 1 let function2 x = x * 5 let res = 10 |> function1 |> function2 printfn "%d" res |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 55 |
در این قسمت از آموزش کار با توابع در #F رو بررسی نمودیم و مشاهده نمودیم که توابع با استفاده از کلید واژه let تعریف می شوند.
انواع تابع و چگونگی فراخوانی یک تابع در #F رو نیز در ادامه بیان نمودیم. در ادامه به بررسی رشته ها در زبان برنامه نویسی #F خواهیم پرداخت.