سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. دنباله ها، مانند لیست ها، یک مجموعه مرتب شده از مقادیر را نشان می دهند. با این حال، عناصر در دنباله یا عبارات توالی در زمان مورد نیاز محاسبه می شوند. آن ها یک بار محاسبه نمی شوند و به همین دلیل از آن ها برای نمایش ساختارهای نامحدود استفاده می شود. بر طبق همین دنباله یا توالی در #F رو در سه جلسه بیان خواهیم نمود و در ابتدا تعریف توالی در #F رو خواهیم داشت.
در ابتدا به چگونگی تعریف توالی در #F می پردازیم.
دنباله ها با استفاده از سینتکس زیر تعریف می شوند:
1 | seq { expr } |
مثال برای تعریف توالی در #F
1 | let seq1 = seq { 1 .. 10 } |
ایجاد عبارات دنباله و دنباله مشابه لیست ها ست، شما می توانید توالی ها را با استفاده از محدوده ها و معقولات ایجاد کنید.
عبارات توالی عبارت هایی هستند که می توانید برای ایجاد توالی ها بنویسید. این را می توان به شکل های زیر انجام داد.
مثال های زیر این مفاهیم را نشان می دهند.( دنباله یا توالی در #F )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | (* Sequences *) let seq1 = seq { 1 .. 10 } (* ascending order and increment*) printfn "The Sequence: %A" seq1 let seq2 = seq { 1 .. 5 .. 50 } (* descending order and decrement*) printfn "The Sequence: %A" seq2 let seq3 = seq {50 .. -5 .. 0} printfn "The Sequence: %A" seq3 (* using yield *) let seq4 = seq { for a in 1 .. 10 do yield a, a*a, a*a*a } printfn "The Sequence: %A" seq4 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 | The Sequence: seq [1; 2; 3; 4; ...] The Sequence: seq [1; 6; 11; 16; ...] The Sequence: seq [50; 45; 40; 35; ...] The Sequence: seq [(1, 1, 1); (2, 4, 8); (3, 9, 27); (4, 16, 64); ...] |
برنامه زیر، اعداد اول را از ۱ تا ۵۰ چاپ می کند.
1 2 3 4 5 6 7 8 9 | (* Recursive isprime function. *) let isprime n = let rec check i = i > n/2 || (n % i <> 0 && check (i + 1)) check 2 let primeIn50 = seq { for n in 1..50 do if isprime n then yield n } for x in primeIn50 do printfn "%d" x |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 |
خب تا این جا تعریف توالی در #F و ایجاد توالی رو همراه مثال دیدیم.
جدول زیر نشان می دهد که عملیات پایه در نوع داده های توالی چگونه است.
مقدار | توضیحات |
---|---|
<append : seq<‘T> → seq<‘T> → seq<‘T | دو enumeration(شمارش) داده شده را به عنوان یک enumeration مرتبط تکی پوشش می دهد. |
average : seq<^T> → ^T | میانگین عناصر در توالی را به دست می آورد. |
averageBy : (‘T → ^U) → seq<‘T> → ^U | میانگین نتایج حاصل از اعمال تابع به هر عنصری از توالی را به دست می آورد. |
<cache : seq<‘T> → seq<‘T | یک توالی را که مرتبط با یک cached version از توالی ورودی است باز می گرداند. |
cast : IEnumerable → seq<‘T> | یک سیستم loosely-typed می کند. مجموعه توالی به عنوان نوع توالی . |
choose : (‘T → ‘U option) → seq<‘T> → seq<‘U> | تابع داده شده را به هر عنصر لیست اعمال می کند. لیستی که شامل نتایج هر عنصری که در آن تابع Some را بازمی گرداند، باز گردانده می شود. |
collect : (‘T → ‘Collection) → seq<‘T> → seq<‘U> | تابع داده شده را به هر عنصر دنباله اعمال می کند و تمام نتایج را پیوند می دهد. |
compareWith : (‘T → ‘T → int) → seq<‘T> → seq<‘T> → int | مقایسه دو توالی با استفاده از تابع مقایسه داده شده، عنصر به عنصر. |
<concat : seq<‘Collection> → seq<‘T | ترکیبی از enumeration-of-enumerations داده شده به عنوان یک شمارش پیوندی تک است. |
countBy : (‘T → ‘Key) → seq<‘T> → seq<‘Key * int> | یک تابع key-generating برای هر عنصر یک دنباله اپلای می کند. و دنباله ای که کلید های yielding unique را برگردانده و تعداد آنها در دنباله اصلی را نشان می دهد را نشان می دهد. |
<delay : (unit → seq<‘T>) → seq<‘T | یک دنباله ای را که از مشخصه delay داده شده یک دنباله ساخته شده است، بازمی گرداند. |
<distinct : seq<‘T> → seq<‘T | یک توالی را که حاوی هیچ ورودی تکراری نیست با توجه به مقایسه generic hash و equality در ورودی ها بازمی گردند. اگر عنصر چندین بار در توالی اتفاق می افتد، رخدادهای بعدی از بین می روند. |
<distinctBy : (‘T → ‘Key) → seq<‘T> → seq<‘T | یک توالی را که حاوی هیچ ورودی تکراری نیست. با توجه به مقایسه های generic hash و equality بر روی کلیدهای بازگشتی که توسط تابع key-generating داده شده، بازمی گرداند. اگر عنصر چندین بار در توالی اتفاق می افتد، رخدادهای بعدی از بین می روند. |
<empty : seq<‘T | توالی خالی ایجاد می کند. |
exactlyOne : seq<‘T> → ‘T | تنها عنصر دنباله را باز می گرداند. |
exists : (‘T → bool) → seq<‘T> → bool | تست این که هر عنصری از توالی به پیش فرض داده شده پاسخ دهد. |
exists2 : (‘T1 → ‘T2 → bool) → seq<‘T1> → seq<‘T2> → bool | تست این که هر جفت عناصر مربوطه از توالی های ورودی منطبق با پیش فرض داده شده است. |
filter : (‘T → bool) → seq<‘T> → seq<‘T> | مجموعه جدیدی را که شامل تنها عناصری از مجموعه است که پیش فرض داده شده true را بازگرداند. |
find : (‘T → bool) → seq<‘T> → ‘T | عنصر اول را برمی گرداند برای این که تابع داده شده true را باز گرداند. |
findIndex : (‘T → bool) → seq<‘T> → int | ایندکس اولین عنصر را باز می گرداند برای این که تابع داده شده true را باز گرداند. |
fold : (‘State → ‘T → ‘State) → ‘State → seq<‘T> → ‘State | یک تابع را برای هر عنصر مجموعه اعمال می کند. یک آرگومان accumulator را از طریق محاسبات تریدینگ می کند. اگر تابع ورودی f است و عناصر i0 … iN، سپس این تابع f (… (f s i0) …) iN را محاسبه می کند. |
forall : (‘T → bool) → seq<‘T> → bool | تست این که تمام عناصر دنباله منطبق بر پیش فرض داده شده باشد. |
forall2 : (‘T1 → ‘T2 → bool) → seq<‘T1> → seq<‘T2> → bool | تست این که تمام جفت عناصر کشیده شده از دو توالی منطبق بر پیش فرض داده شده هستند. اگر یک دنباله کوتاهتر از دیگری باشد، سپس عناصر باقی مانده بیش تر از توالی، نادیده گرفته می شوند. |
groupBy : (‘T → ‘Key) → seq<‘T> → seq<‘Key * seq<‘T>> | یک تابع key-generating را برای هر عنصر یک دنباله اعمال می کند و یک توالی از کلیدهای unique را تولید می کند. هر کلید unique نیز شامل یک توالی از تمام عناصری است که مطابق با این کلید است. |
head : seq<‘T> → ‘T | اولین عنصر دنباله را باز می گرداند. |
<init : int → (int → ‘T) → seq<‘T | یک ترتیب جدید ایجاد می کند که در صورت تکرار، عناصر متوالی را با فراخوانی تابع داده شده برمی گرداند ،به مقدار شمارش داده شده. نتایج فراخوانی تابع ذخیره نمی شوند، بدین معناست که تابع برای ایجاد مجدد عناصر ضروری ست مجدد اپلای شود. این تابع از ایندکس آیتم در حال تولید منتقل می شود. |
<initInfinite : (int → ‘T) → seq<‘T | یک ترتیب جدید ایجاد می کند که در صورت تکرار، عناصر متوالی را با فراخوانی تابع داده شده بازگشت خواهد داد. نتایج فراخوانی تابع ذخیره نمی شوند، به این معنی که برای بازسازی عناصر، ریپلای تابع ضروری خواهد بود. این تابع از ایندکس آیتم در حال تولید منتقل می شود. |
isEmpty : seq<‘T> → bool | تست اینکه آیا دنباله دارای عناصر است |
iter : (‘T → unit) → seq<‘T> → unit | تابع داده شده را به هر عنصر مجموعه اعمال می کند. |
iter2 : (‘T1 → ‘T2 → unit) → seq<‘T1> → seq<‘T2> → unit | تابع داده شده به طور همزمان به دو مجموعه اعمال می شود. اگر یک دنباله کوتاه تر از دیگری باشد، سپس عناصر باقی مانده دنباله طولانی تر، نادیده گرفته می شوند. |
iteri : (int → ‘T → unit) → seq<‘T> → unit | تابع داده شده را به هر عنصر مجموعه اعمال می کند. عدد صحیح یا integer منتقل شده به تابع، نشان دهنده ایندکس عنصر است. |
جدول دنباله یا توالی در #F رو تا همین جا به پایان می رسونیم. ادامه جدول رو در جلسه بعد می بینیم.
در قسمت اول دنباله یا توالی در #F به تعریف توالی در #F پرداختیم.
ادامه مباحث رو در قسمت بعدی دنبال خواهیم نمود.