F # 4.6 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рдШреЛрд╖рдгрд╛

рд╣рдо рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реИрдВ рдХрд┐ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдкрд░ F # рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╢рд┐рдк рдХрд░реЗрдЧрд╛: F # 4.6!


F # 4.6 F # рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ рд╣реИ, рдЬреЛ рдЗрд╕реЗ "рд╕рд╣реА" рдмрд┐рдВрджреБ-рд╡рд┐рдореЛрдЪрди рдмрдирд╛рддрд╛ рд╣реИред рдПрдл # рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдПрдл # 4.6 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЦреБрд▓реЗ рдЖрд░рдПрдлрд╕реА (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдл # рд╕рдореБрджрд╛рдп рдиреЗ рднрд╛рд╖рд╛ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рд╣реИред рдЖрдк рдЗрд╕ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА RFC рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:



рдпрд╣ рдкреЛрд╕реНрдЯ рдлреАрдЪрд░ рд╕реЗрдЯ рдФрд░ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдПрдЧреАред


рдмреНрд▓реЙрдЧ рдореЗрдВ рдореВрд▓

рдЖрд░рдВрдн рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛ рддреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:



рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ FSharp.Core рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ FSharp.Core 4.6 (рдпрд╛ рдЙрдЪреНрдЪрддрд░) рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк Visual Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк NuGet Package Management UI рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк Visual Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рд╣рд╛рде рд╕реЗ рд╕рдВрдкрд╛рджрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:


<ItemGroup> <PackageReference Update="FSharp.Core" Version="4.6.0" /> </ItemGroup> 

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдЯреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк F # 4.6 рдХрд╛ рдЙрдкрдпреЛрдЧ Visual Studio , Mac рдХреЗ рд▓рд┐рдП Visual Studio , рдпрд╛ Ionide рдХреЗ рд╕рд╛рде Visual Studio рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб


рд╡рд┐рднрд┐рдиреНрди рдмрдЧ рдлрд┐рдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдл # 4.6 рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╢реБрд░реВрдЖрдд рд╣реИред


рдореВрд▓ рдЙрдкрдпреЛрдЧ


рдПрдл # -рдСрдирд▓реА рдирдЬрд░рд┐рдП рд╕реЗ, рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рдПрдл # рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдирд╛рдореЛрдВ рдХреА рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддрджрд░реНрде рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рд╡реЗ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрдл # рдХреЛрдб рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╡реЗ рдХрдИ рдЫреЛрдЯреЗ рдЕрдВрддрд░рд╛рд▓реЛрдВ рдХреЛ рднрд░рддреЗ рд╣реИрдВ рдПрдл # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЙрди рд░рд╕реАрдж рдбреЗрдЯрд╛ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред


рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЖрдк рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:


 open System let circleStats radius = let d = radius * 2.0 let a = Math.PI * (radius ** 2.0) let c = 2.0 * Math.PI * radius {| Diameter=d; Area=a; Circumference=c |} let r = 2.0 let stats = circleStats r printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдореБрджреНрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдирдореВрдиреЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:


 let circleStats radius = let d = radius * 2.0 let a = Math.PI * (radius ** 2.0) let c = 2.0 * Math.PI * radius {| Diameter=d; Area=a; Circumference=c |} let printCircleStats r (stats: {| Area: float; Circumference: float; Diameter: float |}) = printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference let r = 2.0 let stats = circleStats r printCircleStats r stats 

рдпрджрд┐ рдЖрдк рдПрдХ рдЧреБрдордирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде `PrintCircleStats` рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдмрд▓ рдереЗ, рддреЛ рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдЧрд╛:


 printCircleStats r {| Diameter=2.0; Area=4.0; MyCircumference=12.566371 |} // Two anonymous record types have mismatched sets of field names '["Area"; "Circumference"; "Diameter"]' and '["Area"; "Diameter"; "MyCircumference"]' 

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдл # рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдмрдЬрд╛рдп рддрджрд░реНрде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдн рдФрд░ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдкрдХреЗ рд╕рднреА рдЕрдк-рдлреНрд░рдВрдЯ рдПрдл # рд░рд┐рдХреЙрд░реНрдб рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдЧреБрдордирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред


рд╕рдВрд░рдЪрдирд╛ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб


рдЕрдЬреНрдЮрд╛рдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЬреНрдЮрд╛рдд рд░рд┐рдХреЙрд░реНрдб рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


 open System let circleStats radius = let d = radius * 2.0 let a = Math.PI * (radius ** 2.0) let c = 2.0 * Math.PI * radius // Note that the keyword comes before the '{| |}' brace pair struct {| Area=a; Circumference=c; Diameter=d |} // the 'struct' keyword also comes before the '{| |}' brace pair when declaring the parameter type let printCircleStats r (stats: struct {| Area: float; Circumference: float; Diameter: float |}) = printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference let r = 2.0 let stats = circleStats r printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference 

рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд▓реЗрддрд╛ рд╣реИ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 let printCircleStats r (stats: struct {| Area: float; Circumference: float; Diameter: float |}) = printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference printCircleStats r struct {| Area=4.0; Circumference=12.6; Diameter=12.6 |} 

рдпрд╛ рдЖрдк рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ `рд╕рдВрд░рдЪрдирд╛` рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП" рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдиреБрдорд╛рди "рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 let printCircleStats r (stats: struct {| Area: float; Circumference: float; Diameter: float |}) = printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference printCircleStats r {| Area=4.0; Circumference=12.6; Diameter=12.6 |} 

рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдордЭреЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдереАред


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░рд┐рд╡рд░реНрд╕ рд╕рдЪ рдирд╣реАрдВ рд╣реИ:


 let printCircleStats r (stats: {| Area: float; Circumference: float; Diameter: float |}) = printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f" r stats.Diameter stats.Area stats.Circumference // This will fail to compile for hopefully obvious reasons! printCircleStats r struct {| Area=4.0; Circumference=12.6; Diameter=12.6 |} 

рд╡рд░реНрддрдорд╛рди рдореЗрдВ IsByRefLike рдпрд╛ IsReadOnly рд╕рдВрд░рдЪрд┐рдд рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдПрдХ рднрд╛рд╖рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдЬреЛ рдЗрд╕ рд╡реГрджреНрдзрд┐ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡рд┐рд╖рдорддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдЕрднреА рднреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╣реИред


рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдирд╛


рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреНрд░рдордмрджреНрдз рд╣реИрдВ


рдЖрдк рдЧреБрдордирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХреНрд░рдордмрджреНрдз рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 open Newtonsoft.Json let phillip = {| name="Phillip"; age=28 |} let str = JsonConvert.SerializeObject(phillip) printfn "%s" str let phillip' = JsonConvert.DeserializeObject<{|name: string; age: int|}>(str) printfn "Name: %s Age: %d" phillip'.name phillip'.age 

рдпрд╣ рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 {"age":28,"name":"Phillip"} Name: Phillip Age: 28 

рдпрд╣рд╛рдВ рдПрдХ рдирдореВрдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:


 namespace AnonyRecdOne open Newtonsoft.Json module AR = let serialize () = let phillip = {| name="Phillip"; age=28 |} JsonConvert.SerializeObject(phillip) 

 open AnonyRecdOne open Newtonsoft.Json [<EntryPoint>] let main _ = let str = AR.serialize () let phillip = JsonConvert.DeserializeObject<{|name: string; age: int|}>(str) printfn "Name: %s Age: %d" phillip.name phillip.age 

рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдмрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рд▓реНрдХрд╛ рдбреЗрдЯрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред


рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рдЖрдкрдХреЗ рдбреЛрдореЗрди рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдЬреИрд╕рд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг:


 type FullName = { FirstName: string; LastName: string } type Employee = | Engineer of FullName | Manager of name: FullName * reports: Employee list | Executive of name: FullName * reports: Employee list * assistant: Employee 

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЬрд┐рдирдХрд╛ рдирд╛рдо рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЛ рдирд┐рдореНрди рдХреЗ рд╕рд╛рде рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


 type FullName = { FirstName: string; LastName: string } type Employee = | Engineer of FullName | Manager of Manager | Executive of Executive and Manager = { Name: FullName; Reports: Employee list } and Executive = { Name: FullName; Reports: Employee list; Assistant: Employee } 

рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рддреЛ рдЗрд╕ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдм рдЧреБрдордирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 type FullName = { FirstName: string; LastName: string } type Employee = | Engineer of FullName | Manager of {| Name: FullName; Reports: Employee list |} | Executive of {| Name: FullName; Reports: Employee list; Assistant: Employee |} 

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд░рд╣, рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдФрд░ рдЖрдкрдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб F # рдореЗрдВ LINQ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ


F # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд▓рд┐рд╕реНрдЯ, рдПрд░реЗ рдФрд░ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрднреА-рдХрднреА LINQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдереЛрдбрд╝рд╛ рджрд░реНрджрдирд╛рдХ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ LINQ C # рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде, рдЖрдк LINQ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк C # рдФрд░ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░реЗрдВрдЧреЗ:


 open System.Linq let names = [ "Ana"; "Felipe"; "Emillia"] let nameGrouping = names.Select(fun n -> {| Name=n; FirstLetter=n.[0] |}) for ng in nameGrouping do printfn "%s has first letter %c" ng.Name ng.FirstLetter 

рдпрд╣ рдкреНрд░рд┐рдВрдЯ:


 Ana has first letter A Felipe has first letter F Emillia has first letter E 

рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдЕрдиреНрдп ORM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХрд░рддреЗ рд╣реИрдВ


F # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП F # рдХреНрд╡реЗрд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рд╕реБрдзрд╛рд░ рдХреЗ рдХреБрдЫ рдорд╛рдореВрд▓реА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ cl select` рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ рдбреЗрдЯрд╛ рдореЗрдВ рдЯреБрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 let q = query { for row in db.Status do select (row.StatusID, row.Name) } 

рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдЗрдЯрдо 1 рдФрд░ рдЖрдЗрдЯрдо 2 рдЬреИрд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИрдВред рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:


 let q = query { for row in db.Status do select {| StatusID = row.StatusID; Name = row.Name |} } 

рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рд╕рд╛рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрд╣ рдХреНрд╡реЗрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдореЙрдбрд▓ рдХрд░рддреЗ рд╣реИрдВред


рдмреЗрдирд╛рдореА рд░рд┐рдХреЙрд░реНрдб рднреА рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдРрдб-рд╣реЙрдХ рд╕рдореВрд╣реАрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдмреЗрдирд╛рдореА рдСрдмрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб ASP.NET рдХреЛрд░ рдореЗрдВ рдХрд╕реНрдЯрдо рд░реВрдЯрд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ


рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдПрдл # рдХреЗ рд╕рд╛рде ASP.NET рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рд░реВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реЛред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЕрднреА рднреА рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╛рдордиреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдПрдл # рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЖрдк рдЗрд╕реЗ рдЗрдирд▓рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 app.UseMvc(fun routes -> routes.MapRoute("blog","blog/{*article}", defaults={| controller="Blog"; action="Article" |}) |> ignore ) |> ignore 

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЕрднреА рднреА рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдл # рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЦреНрдд рд╣реИ (рд╕реА # рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ ASP.NET рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рднрд╛рд╡реЛрдВ рдХреЛ рдХреЙрдкреА рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ


рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдХреЙрдкреА-рдПрдВрдб-рдЕрдкрдбреЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 let data = {| X = 1; Y = 2 |} let expandedData = {| data with Z = 3 |} // Gives {| X=1; Y=2; Z=3 |} let stringifiedY = {| expandedData with Y="Hello!" |} // Gives {| X=1; Y="Hello!"; Z=3 |} 

рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ:


 type R = { X: int } let data = { X=1 } let data' = {| data with Y = 2 |} // Gives {| X=1; Y=2 |} 

рдЖрдк рд╕рдВрджрд░реНрдн рдФрд░ рд╕рдВрд░рдЪрд┐рдд рдЕрдирд╛рдо рдЕрднрд┐рд▓реЗрдЦреЛрдВ рд╕реЗ рднреА рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 // Copy data from a reference record into a struct anonymous record type R1 = { X: int } let r1 = { X=1 } let data1 = struct {| r1 with Y=1 |} // Copy data from a struct record into a reference anonymous record [<Struct>] type R2 = { X: int } let r2 = { X=1 } let data2 = {| r1 with Y=1 |} 

рдХреЙрдкреА-рдФрд░-рдЕрдкрдбреЗрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ F # рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЙрдЪреНрдЪ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИред


рд╕рдорд╛рдирддрд╛ рдФрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди


рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорддреБрд▓реНрдп рдФрд░ рддреБрд▓рдиреАрдп рд╣реИрдВ:


 {| a = 1+1 |} = {| a = 2 |} // true {| a = 1+1 |} > {| a = 1 |} // true 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЙрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


 // error FS0001: Two anonymous record types have mismatched sets of field names '["a"]' and '["a"; "b"]' {| a = 1+1 |} = {| a = 2; b = 1|} 

рдпрджреНрдпрдкрд┐ рдЖрдк рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреА рдмрд░рд╛рдмрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЙрди рдкрд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реИ:


  • рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЙрдк-рд╕рдорд░реНрдерди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред
  • рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдЯрд░реНрди рд░рдЦрдиреЗ рдХреА рдХреЛрдИ рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рдПрдХ рдЕрд▓рдЧ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред
  • рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╣рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЦрд╛рддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ "рдбреЙрдЯ" рдЕрдВрдХрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛ рджреЗрдЧреАред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, "dot" -syntax рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд░реНрдмреЛрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХрдо рдореВрд▓реНрдп рдХреА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рд╣рд░ рдореВрд▓реНрдп рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдПрдХ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рд╕рдВрдШ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ:


 type Employee = | Engineer of FullName | Manager of {| Name: FullName; Reports: Employee list |} | Executive of {| Name: FullName; Reports: Employee list; Assistant: Employee |} let getFirstName e = match e with | Engineer fullName -> fullName.FirstName | Manager m -> m.Name.FirstName | Executive ex -> ex.Name.FirstName 

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реАрдорд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЙрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ!


FSharp.Core рдЕрддрд┐рд░рд┐рдХреНрдд


рдпрд╣ рдПрдл # рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдФрд░ рдПрдл # рд░рд┐рд▓реАрдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛!


рдорд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


ValueOption рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп F # 4.5 рдореЗрдВ рдЕрдм рдХреБрдЫ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рдЕрдЪреНрдЫрд╛рдЗрдпрд╛рдБ рд╣реИрдВ:


  • рдбреАрдмрдЧрд░реНрдЧрд░рдбрд┐рд╕реНрдкреНрд▓реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • IsNone , IsSome , рдХреЛрдИ рдирд╣реАрдВ , рдХреБрдЫ , op_Implicit , рдФрд░ ToString рд╕рджрд╕реНрдп

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ "рд╕рдорддрд╛" рджреЗрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрдм рдПрдХ ValueOption рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ `Option` рдореЙрдбреНрдпреВрд▓ рд╣реИ:


 module ValueOption = [<CompiledName("IsSome")>] val inline isSome: voption:'T voption -> bool [<CompiledName("IsNone")>] val inline isNone: voption:'T voption -> bool [<CompiledName("DefaultValue")>] val defaultValue: value:'T -> voption:'T voption -> 'T [<CompiledName("DefaultWith")>] val defaultWith: defThunk:(unit -> 'T) -> voption:'T voption -> 'T [<CompiledName("OrElse")>] val orElse: ifNone:'T voption -> voption:'T voption -> 'T voption [<CompiledName("OrElseWith")>] val orElseWith: ifNoneThunk:(unit -> 'T voption) -> voption:'T voption -> 'T voption [<CompiledName("GetValue")>] val get: voption:'T voption -> 'T [<CompiledName("Count")>] val count: voption:'T voption -> int [<CompiledName("Fold")>] val fold<'T,'State> : folder:('State -> 'T -> 'State) -> state:'State -> voption:'T voption -> 'State [<CompiledName("FoldBack")>] val foldBack<'T,'State> : folder:('T -> 'State -> 'State) -> voption:'T voption -> state:'State -> 'State [<CompiledName("Exists")>] val exists: predicate:('T -> bool) -> voption:'T voption -> bool [<CompiledName("ForAll")>] val forall: predicate:('T -> bool) -> voption:'T voption -> bool [<CompiledName("Contains")>] val inline contains: value:'T -> voption:'T voption -> bool when 'T : equality [<CompiledName("Iterate")>] val iter: action:('T -> unit) -> voption:'T voption -> unit [<CompiledName("Map")>] val map: mapping:('T -> 'U) -> voption:'T voption -> 'U voption [<CompiledName("Map2")>] val map2: mapping:('T1 -> 'T2 -> 'U) -> voption1: 'T1 voption -> voption2: 'T2 voption -> 'U voption [<CompiledName("Map3")>] val map3: mapping:('T1 -> 'T2 -> 'T3 -> 'U) -> 'T1 voption -> 'T2 voption -> 'T3 voption -> 'U voption [<CompiledName("Bind")>] val bind: binder:('T -> 'U voption) -> voption:'T voption -> 'U voption [<CompiledName("Flatten")>] val flatten: voption:'T voption voption -> 'T voption [<CompiledName("Filter")>] val filter: predicate:('T -> bool) -> voption:'T voption -> 'T voption [<CompiledName("ToArray")>] val toArray: voption:'T voption -> 'T[] [<CompiledName("ToList")>] val toList: voption:'T voption -> 'T list [<CompiledName("ToNullable")>] val toNullable: voption:'T voption -> Nullable<'T> [<CompiledName("OfNullable")>] val ofNullable: value:Nullable<'T> -> 'T voption [<CompiledName("OfObj")>] val ofObj: value: 'T -> 'T voption when 'T : null [<CompiledName("ToObj")>] val toObj: value: 'T voption -> 'T when 'T : null 

рдпрд╣ рдХрд┐рд╕реА рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ `ValueOption`` Option` рдХрд╛ рдЕрдЬреАрдм рднрд╛рдИ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред


tryExactlyOne рд╕реВрдЪреА, рд╕рд░рдгреА, рдФрд░ Seq рдХреЗ рд▓рд┐рдП


рдЗрд╕ рдмрдврд╝рд┐рдпрд╛ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдпреЛрдЧрджрд╛рди рдЧреНрд░реЗрдЬрд╝рдЧреЛрд░рдЬрд╝ рдбрд┐рдпрд╛рдЬрд╝реНрдбрдХреНрдпреВрд╡рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 List.tryExactlyOne [] // None List.tryExactlyOne [1] // Some 1 List.tryExactlyOne [1; 2] // None Array.tryExactlyOne null // ArgumentNullException Array.tryExactlyOne [||] // None Array.tryExactlyOne [|1|] // Some 1 Array.tryExactlyOne [|1; 2|] // None Seq.tryExactlyOne null // ArgumentNullException Seq.tryExactlyOne (Seq.ofList []) // None Seq.tryExactlyOne (Seq.ofList [1]) // Some 1 Seq.tryExactlyOne (Seq.ofList [1; 2]) // None 

рд▓рдкреЗрдЯрддрд╛ рд╣реБрдЖ


рдпрджреНрдпрдкрд┐ F # 4.6 рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдХреБрд▓ рд╕реВрдЪреА рдмрд╣реБрдд рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рд╡реЗ рдХрд╛рдлреА рдЧрд╣рд░реА рд╣реИрдВ! рд╣рдо рдЖрдкрдХреЛ F # 4.6 рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдкреВрд░реНрдг рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХреЗрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, F # рд╕рдореБрджрд╛рдп рдХреЛ рдЙрдирдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдХреЛрдб рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдЪрд░реНрдЪрд╛ рджреЛрдиреЛрдВ рдореЗрдВ - рдЬреЛ рд╣рдореЗрдВ F # рднрд╛рд╖рд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред


рдЪреАрдпрд░реНрд╕, рдФрд░ рдЦреБрд╢ рд╣реИрдХрд┐рдВрдЧ!

Source: https://habr.com/ru/post/hi437666/


All Articles