рдкрд┐рдЫрд▓реЗ рдиреЛрдЯреЛрдВ (
рднрд╛рдЧ I ,
рднрд╛рдЧ II ) рдореЗрдВ C # 5 рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдХрд┐ Haskell, F # рдФрд░ Nemerle рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, C # рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпреЗ рднрд╛рд╖рд╛рдПрдБ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВред рдЬреЛ рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд╕ рдХреА рд╢реИрд▓реА рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ / рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ рдХрд┐ рдиреЗрдореЗрд░реНрд▓реЗ рдореЗрдВ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЦреБрдж рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИред рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдирд╛рдо рдореЛрдирд╛рдб рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЛрдирдбреНрд╕ рдЖрдкрдХреЛ рдЕрдиреНрдп рдЕрдЪреНрдЫрд╛рдЗрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реВрдЪреА рдХреА рд╕рдордЭ, рдирд┐рд░рдВрддрд░рддрд╛, рдЧрдВрджреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рдл рдмреНрд▓реЙрдХ рдореЗрдВ рдмрджрд▓рдирд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЬреНрдп рдХреЛ рдШрд╕реАрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдЕрдиреНрдпред
рдХреБрдЫ рд╕рдВрдиреНрдпрд╛рд╕реА рд╕реА # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреА рдРрд╕реА "рдЗрдЪреНрдЫрд╛рдУрдВ" рдХреЛ рдЙрдкрдЬ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕реЗ рдЙрдкрдЬ рдФрд░ рдЙрдкрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд┐рдореЗрд░рд▓ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рд╕рдВрдЧрдгрдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ F # рд╕реАрдЦ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдиреЗрдорд╛рд░рд▓ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди F # рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдп рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ (
рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдмрд╛рдж ) рдПрдХ-рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЧрдгрдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢рд╛рдпрдж рд╣рд░ рдХреЛрдИ рдЬрд┐рд╕рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдХреНрдпрд╛ рд╣реИ, рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдерд╛ред рдореИрдВ рд╡рд┐рд╡рд░рдг рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рд╡реЗ рдпрд╛рдж рд░рдЦреЗрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЖрдЧреЗ рдХреЗ рдХрдерди рдХреЛ рд╕рдордЭ рд╕рдХреЗрдВред
рдЗрдХрд╛рдИ
рдореЛрдирд╛рдб рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд░реНрдерди рднрд╛рд╖рд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реА рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИ:
рдмрд╣реБрд░реВрдкреА рдкреНрд░рдХрд╛рд░
interface F<T> { ... }
рдФрд░ рдЙрд╕ рдкрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ
class M { static public F<T> Return<T>(T obj) { ... } static F<U> Bind<T,U>(F<T> obj, Func<T, F<U>> fun) { ... } }
рд╡рд╛рдкрд╕реА рдЖрдкрдХреЛ рдПрдХ рдореЛрдирд╛рдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ "рд▓рдкреЗрдЯрдиреЗ" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдВрдж рдЙрд╕ рдкрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдордЬреЛрд░ рд╕рд╛рджреГрд╢реНрдп StringBuilder рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ * рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк F рдХреЛ IEnumerable рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Bind рд╣рд╕реНрддрд╛рдХреНрд╖рд░ Linq SelectMany рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдирдХ рдорд╣рд╛рди рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде, рдПрдХ рдорда рднреА рд╣реИред рд╕рдВрдпреЛрдЧ рд╕реЗ, рдмрд╛рд░реНрдЯ рдбреА рд╕реНрдореЗрдЯ рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ PDC2010 рдореЗрдВ "LINQ, рдЯреЗрдХ рдЯреВ - рд▓рд┐рдВрдХрди рдХреЛ рд╕рдм рдХреБрдЫ рдбреНрд░реАрдо" (
рд▓рд┐рдВрдХ ) рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдмрддрд╛рдпрд╛ред
рдпрджрд┐ рд▓рд┐рдирдХ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИ, рддреЛ рдПрдХ рд╕рд░рд▓ рд▓рд╛рдЗрдирдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
var nums = Enumerable.Range(-2, 7); var sqrt = from n in nums where n >=0 select Math.Sqrt(n);
рдПрдо-рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдо-рдСрдкрд░реЗрд╢рди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
static class MList { static public IEnumerable<T> Return<T>(T obj) { var list = new List<T>(); list.Add(obj); return list; } static public IEnumerable<U> Bind<T, U>(this IEnumerable<T> obj, Func<T, IEnumerable<U>> fun) { return obj.SelectMany(fun); } static public IEnumerable<T> Empty<T>() { return Enumerable.Empty<T>(); } }
рдФрд░ Linq рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛:
var nums = Enumerable.Range(-2, 7); var sqrt = nums .Bind(n => n >= 0 ? MList.Return(n) : MList.Empty<int>()) .Bind(n => MList.Return(Math.Sqrt(n)));
рдпрд╣ рд▓рд┐рдирдХ рд╕реЗ рднреА рдмрджрддрд░ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореЛрдирдб рд╕рдорд░реНрдерди рд╕реА # рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рдореЗрд░реНрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдПрдо-рдСрдкрд░реЗрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
class MList { public Return[T](obj : T) : IEnumerable[T] { def data = List(); data.Add(obj); data } public Bind[T, U](obj : IEnumerable[T], f : T->IEnumerable[U]) : IEnumerable[U] { obj.SelectMany(f) } public Empty[T]() : IEnumerable[T] { Enumerable.Empty() } }
рдФрд░ Linq рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛:
def mlist = MList(); def nums = Enumerable.Range(-2, 7); def sqrt = comp mlist { defcomp n = nums; defcomp n = if (n >= 0) mlist.Return(n) else mlist.Empty(); return Math.Sqrt(n :> double); };
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдиреЗрдореЗрд░реНрд▓реЗ рдореЗрдВ рд╣рд╛рд░ C # рдореЗрдВ var рдХрд╛ рдПрдХ рдЧреИрд░-рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЕрдЧрд░ рдПрдХ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ ((:);) рд╣реИ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдХрдВрдк рд╕рдВрдЪрд╛рд▓рдХ рдиреЗ рдореЛрдирдбрд┐рдХ рдЧрдгрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдШреЛрд╖рдгрд╛ рдХреА, рдЕрдЧрд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдо-рдСрдкрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рдЪрд▓рддреА рд╣реИред
рд▓рд╛рдЗрдирдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рддреАрди рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рд╕рд╛рдзрд╛рд░рдг рдХреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ рдЬреЛ рдПрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдореВрд▓ рд╕реЗ рдПрдХ рдирдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдХрд┐ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
defcomp рдПрдХ рдореИрдЬрд┐рдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдПрдХ рдореЛрдирд╛рдб (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд╛рдЗрдк IEnumerable [T]) рдХреЛ рдПрдХ рд╡реИрд▓реНрдпреВ (рдЯрд╛рдЗрдк T рдХрд╛) рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдорд╛рди рдХреЛ рдореЛрдирд╛рдб рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд░реНрдл рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ
defcomp n = nums; ...
рдореЗрдВ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд
mlist.Bind(nums, n => ...)
рдЕрднрд┐рдХрд▓рди рднрд╛рд╡
рдпрджрд┐ рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдЗрд╕ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рдЗрдмреНрд░рд┐рдб рднрд╛рд╖рд╛рдУрдВ (рдХрд╛рд░реНрдпрд╛рддреНрдордХ / рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рд╣рд╛рд▓рдд рдСрдкрд░реЗрдЯрд░реЛрдВ, рдЫреЛрд░реЛрдВ, рдФрд░ рдЙрдкрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреИрд╕реЗ рдмрдирддреА рд╣реИ, рд╣рдо рдПрдо-рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд▓реВрдк рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдо-рдСрдкрд░реЗрд╢рдВрд╕ рдФрд░ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдбрд┐рдлреНрд▓реЗрдХ рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдПрдо-рдСрдкрд░реЗрд╢рди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╢рд╛рдЦрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдЫреЛрд░реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВрдЧреЗ:
public F<FakeVoid> While<T>(Func<bool> cond, Func<F<FakeVoid>> body)
рдФрд░ рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рд▓реВрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд▓реВрдк рдмреЙрдбреА рдХреЛ рдПрдХ Bind рд╢реНрд░рдВрдЦрд▓рд╛ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЪреВрдВрдХрд┐ Bind F <T> рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕ рдЪреЗрди рдХреЛ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ "() =" рдмреЙрдбреА () "рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдлрдВрдХ <рдПрдл <рдЯреА >>, рд╕рдВрдХрд▓рдХ рднреА рд▓реИрдВрдмрдбрд╛ рдореЗрдВ рд▓реВрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рд▓реИрдВрдмрдбрд╛рд╕ рдХреЛ рдПрдо-рдСрдкрд░реЗрд╢рди рдЬрдмрдХрд┐ред
рдкреНрд░рддреНрдпреЗрдХ рдПрдо-рдСрдкрд░реЗрд╢рди рдХреЛ рдПрдХ рдореЛрдирд╛рдб рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд▓реВрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореЛрдирд╛рдб рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдлреЗрдХрд╡реЙрдЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдЕрднрд┐рдХрд▓рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорда рд╣реИред рдП-рд▓рд╛ рд╣реИрд╕реНрдХреЗрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗрд╡рд▓ рдбрд┐рдлреНрд▓реИрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдореЛрдиреИрдбрд┐рдХ рдЧрдгрдирд╛ рдХреЗ рдЕрдВрджрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдг рднреА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡реЗ рд╕рднреА рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдЬреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
defcomp | рдореЛрдирд╛рдб рдХреЛ рдЕрд░реНрде рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдХрд░реАрдм рд╣реИ |
callcomp | рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдореВрд▓реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ |
рд╡рд╛рдкрд╕реА | рдПрдХ рд╕рдирдХ рдореЗрдВ рддрд░реНрдХ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдореБрджреНрд░реАрдХрд░рдг рдХреА рдЧрдгрдирд╛ рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдХрд░реАрдм рд╣реИ |
returncomp | рддрд░реНрдХ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИ, рдЗрд╕ рдореЛрдирд╛рдб рдХреЛ рдПрдХ рдорд╛рдирджрд┐рдХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджреЗрддрд╛ рд╣реИ, рд╡рд╛рдкрд╕реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ |
рдЙрдкрдЬ | рддрд░реНрдХ рдХреЛ рдПрдХ рд╕рдирдХ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдЬ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ |
yieldcomp | рддрд░реНрдХ - рд╕рдиреНрдпрд╛рд╕реА, рдЙрдкрдЬ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдЬ рдХреЗ рд╡рд┐рдкрд░реАрдд рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рдкреЗрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ |
рдЕрдЧрд░, рдЬрдм, рдЬрдм рддрдХ, рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, foreach, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ... рдЕрдВрдд рдореЗрдВ ... рдкрдХрдбрд╝ | рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╕рдВрд╕реНрдХрд░рдг |
рдПрдо-рдСрдкрд░реЗрд╢рди рдХреЗ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╢рдмреНрджред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░, рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрднрд┐рдХрд▓рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рд╡рд┐рдзрд╛рдпрдХ рдмрд┐рд▓реНрдбрд░ (рдХреЗрд╡рд▓ defcomp рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдФрд░ рд╡рд╛рдкрд╕реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдПрдо-рдСрдкрд░реЗрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╕реНрдерд┐рддрд┐ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдореЛрдирдбреНрд╕ рдФрд░ рдПрдо-рдСрдкрд░реЗрд╢рди рдХреА рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореЛрдирд╛рдб рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЧреЗ рдХреЗ рдХрдерди рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрдЯрд┐рдиреНрдпреВрдб рдореЛрдирд╛рдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рд╣реИ рдХрд┐
рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред
рдорд╛рдирдХ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг
рдорд╛рдирдХ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреА рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдореНрдк рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдирдХреЗ рдирд╛рдо рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╕реВрдЪреА
рд╕реВрдЪреА рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛, рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдкрдЬ рдФрд░ рдЙрдкрдЬ рдХрд╛ рд╕рдорд░реНрдерди рднреА рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдореЛрдирд╛рдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреА [рдЯреА] (рдиреЗрдореЗрд░реНрд▓реЗ рдореЗрдВ рдорд╛рдирдХ рд╕реВрдЪреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рд╕реА # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рджреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕реНрдерд╛рдпреА "рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рд▓реИрдореНрдмреНрдбрд╛ рд╕реЗ рдЙрдкрдЬ рдФрд░ рдЙрдкрдЬ рд╕рдВрдЧреНрд░рд╣ред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдЗрдП рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд╛рдЗрдирдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рджреЗрдЦреЗрдВ:
def num = Enumerable.Range(-2, 7); def sqrt : list[double] = comp list { foreach(n in num) when(n >= 0) yield Math.Sqrt(n); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реВрдЪреА рдмрд┐рд▓реНрдбрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЬрдЧрд╣ рдореЗрдВ рдЙрдкрдЬ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрдк рд▓рд┐рдВрдХ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдордХрдХреНрд╖ рд▓рд╛рдЗрдирдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдЕрдм рдПрдХ рдФрд░ "рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдЙрдкрдЬ рд╕рдВрдЧреНрд░рд╣, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдкрдЬ рд╕рдВрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВред
def upTo(n) { comp list { for(mutable i=0;i<n;i++) yield i } } def twice = comp list { repeat(2) yieldcomp upTo(3); } Console.WriteLine(twice); //[0, 1, 2, 0, 1, 2]
рдореБрдЭреЗ рдЕрдкрдирд╛ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдерд╛, рдФрд░ рдЯрд╛рдЗрдк рдХреЗ рдХрд╛рд░рдг "Enumerable.Range (0, 3)" рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпреАрд▓реНрдбрдХреИрдк рдПрдХ рдореЛрдирдб рдХреЛ рдЗрдирдкреБрдЯ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреА [int], рдФрд░ "Enumerable .ange (0, 3) рд╣реИред "IEnumerable [int] рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╕рдВрдЧрддрд┐ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рдмрд┐рд▓реНрдбрд░ рд╣реИ - рдЕрд╕рдВрдЦреНрдпред
рдЧрдгрдиреАрдп
рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рд▓рд┐рд╕реНрдЯ рдмрд┐рд▓реНрдбрд░ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ IEnumerable [T] рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЛрдирд╛рдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдирдВрдд рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
def twice = comp enumerable { repeat(2) yieldcomp Enumerable.Range(0, 3); } foreach(item in twice) Console.Write($"$item "); //0, 1, 2, 0, 1, 2
рд╕рд░рдгреА
рд╕реВрдЪреА рдФрд░ рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдХреА рддрд░рд╣, рд╕рд░рдгреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдореЛрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рдгреА [рдЯреА] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
async
рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдмрд┐рд▓реНрдбрд░, рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╕реА # рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореМрдЬреВрджрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдВрдпреЛрдЬрдиред
рдпрд╣ рдЙрдкрдЬ рдФрд░ рдЙрдкрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдореЛрдирдб рдкреНрд░рдХрд╛рд░ Async [T] рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдк T рдХрд╛ рдорд╛рди рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ рдЯрд╛рд╕реНрдХ <T> C # рдореЗрдВ), рдпрджрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдорд╛рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ T рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ FakeVoid рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдЗрдВрдб рдСрдкрд░реЗрд╢рди, рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ Async [T] * (T-> Async [U]) -> Async [U], рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ "рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ (рдкреНрд░рдХрд╛рд░ Async [T])" рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк T рдХреА рдПрдХ рд╡рд╕реНрддреБ рд▓реЗрддрд╛ рд╣реИ (рдкрд░рд┐рдгрд╛рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЧрдгрдирд╛) рдФрд░ рдПрдХ рдирдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░рдХрд╛рд░ рдПрд╕рд┐рдВрдХреНрд╕ [рдпреВ] рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ ExecutionContext рд╣реИ, рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдореЗрдВ, рдереНрд░реЗрдбрдкреВрд▓ рд╕реЗ рдереНрд░реЗрдб рдореЗрдВ, рдпрд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:
public abstract class ExecutionContext { public abstract Execute(computatuion : void -> void) : void; }
рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди (рдХреНрд▓рд╛рд╕ Async [T]) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдПрдХреНрд╕реЗрдХреНрдпреБрд╢рдирдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирд┐рд░реНрдгрдп рдХреЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЛ ThreadPool.QueueUserWorkItem рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рд╕реНрддрд╛рд░ (async CTP), рдЬреЛ рдЖрдкрдХреЛ C # рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкреВрд░рдХ рд╣реИрдВред Async рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдорда рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрджрд╛ рдЖрджрд┐рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛ HttpWebRequest рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореМрдЬреВрдж рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
public class HttpWebRequest : WebRequest, ISerializable { public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state); public override WebResponse EndGetResponse(IAsyncResult asyncResult); }
рдЕрдм рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдЗрди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрдиреЛрдПрдбрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
public module AsyncExtentions { public GetResponseAsync(this request : HttpWebRequest) : Async[WebResponse] { Async.FromBeginEnd(request.BeginGetResponse(_, null), request.EndGetResponse(_)) } }
рдпрд╣ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдиреЗрдореЗрд░реНрд▓реЗ рдореЗрдВ _ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдВрдХрди рдЪ (_) x => f (x) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ)ред рдЗрд╕реА рддрд░рд╣, рдЖрдк рдХрд┐рд╕реА рднреА рдорд╛рдирдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, (C # 101) Async рдирдореВрдиреЛрдВ рд╕реЗ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдореЗрд░реНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рд╢реАрд░реНрд╖рдХ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛, рдореИрдВрдиреЗ GetHtml () рдФрд░ GetTitle () рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╣реА рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
public PrintTitles() : Async[FakeVoid] { comp async { def response1 = HttpWebRequest.Create("http://www.ya.ru").GetResponseAsync(); def response2 = HttpWebRequest.Create("http://www.habr.ru").GetResponseAsync(); defcomp response1 = response1; defcomp response2 = response2; Console.WriteLine(response1.GetHtml().GetTitle()); Console.WriteLine(response2.GetHtml().GetTitle()); } }
рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреГрд╖реНрда рд▓реЛрдбрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИрдВ, рд╕рдВрдХрд▓рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ Async [WebResponce] (monad) рд╣реИред рдЕрдЧрд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдЕрд░реНрде рдореЗрдВ рдореЛрдирд╛рдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрде рдХреЗ рдПрдХ рдФрд░ рд╕реНрддрд░ рдкрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ред рдЕрдВрддрд┐рдо рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ (
рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ) рдкрд░ рдЪрд░реНрдЪрд╛ рдмрд╣реБрдд рдЧрд░реНрдо рд╣реЛ рдЧрдИ: 90 рдкрд╕рдВрджреАрджрд╛, 100 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ред
рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдореЛрдирд╛рдб рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрдЯрд░реНрди рд╣реИ, рдЖрдкрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯрдЯрд╛рдЗрдХ () рдкреНрд░рд╛рд░рдВрдн () рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (GetResult) рдХреА рддрд░рд╣ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╡рд┐рдзрд┐ Async [T] рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рдЙрдирдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ ред рднреЗрдж рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрднрд╡рдд: рдПрдХ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдПрдХ Async рдкреНрд░рддреНрдпрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
As # рдкрд░ рдЕрдкрдиреЗ рджреВрд╕рд░реЗ рд▓реЗрдЦ / C # рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд, рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдиреЗрдореЗрд▓реЗ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЧрдгрдирд╛ рдХреЛ рдПрдХ рдзрд╛рдЧреЗ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рдмрдЯрди рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
private button1_Click (sender : object, e : System.EventArgs) : void { def formContext = SystemExecutionContexts.FromCurrentSynchronizationContext(); def task = comp async { Thread.Sleep(5000); callcomp Async.SwitchTo(formContext); label1.Text = "success"; } _ = task.Start(SystemExecutionContexts.ThreadPool()); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рдПрдХреНрд╕рдХреЙрдирд┐рдпрдирдХреЛрдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ: рдереНрд░реЗрдбред рд╕реНрд▓реАрдк рдПрдХ рднрд╛рд░реА рдЧрдгрдирд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдереНрд░реЗрдб рдХреЗ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд┐рд╡ рд░реЗрдлрд░реЗрдВрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдЧрдгрдирд╛ рдЦреБрдж ExecutionContexts рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИред
рдпрд╣ рдЬрд╛рджреВ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реБрдЖ рдерд╛, рдХреЙрд▓рдХрдВрдк рдХреЗрд╡рд▓ рдореЛрдирд╛рдб рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдХрд╛ рдЕрд░реНрде рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХреНрдпреЛрдВ? рдпрд╣ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдФрд░ рд░рд╛рдЬреНрдп рдХреА рдмрд╛рдд рд╣реИ, рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд░рд╛рдЬреНрдп рдХреЛ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджреНрдШрд╛рдЯрди рдХреЗ рд╕рдордп рдореЛрдирд╛рдб рдХреА рдЗрд╕ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдпрд╣рд╛рдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд╛рдЬреНрдп рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдирдП рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ
рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред
Async.SwitchTo рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдореЛрдирдб рд╣реИрдВ рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Async.Yield рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ рдмрджрд▓рддрд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм рдереНрд░реЗрдбрдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдкреВрд▓ рд╕реЗ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдХреВрдж рдХреЛ рдЙрдХрд╕рд╛рддреА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рднрд┐рдХреНрд╖реБ рдмрд╣реБрдд рд╕рдореГрджреНрдз рд╡рд┐рд╖рдп рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрдЯреЗрдЯ, рдХреЙрдиреНрдЯ (рдирд┐рд░рдВрддрд░рддрд╛), рд╢рд╛рдпрдж (рдПрдХ рдФрд░ C # fanboy рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ) рдЬреИрд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рд╛рдзреБрдУрдВ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖред рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд┐рд╕рдХреА рдмрджреМрд▓рдд рдЖрдк рдирд┐рдирд░реНрдорд▓ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рд╕реВрдЪреА / рдЕрдореВрд░реНрдд рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ, рднрд╡рд┐рд╖реНрдп C # рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ / async рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдиреЗрдореЗрд░рд▓ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рд╛рдХреНрд╖рд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ / async рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ рд╣реИ, рднрд╛рд╖рд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдиреЗрдорд╛рд░рд▓ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЛрдирдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рднрд╛рд╖рд╛, рднрд╛рд╖рд╛ рдирд╣реАрдВ)ред
рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред