рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдПрдл # рдпрд╛рддреНрд░рд╛ рдЬрд╛рд░реА рд╣реИред рд╣рдордиреЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рджреЗрдЦрд╛, рдЬреИрд╕реЗ рд░рд┐рдХреЙрд░реНрдбреНрд╕ / рдЯреНрдпреВрдкрд▓реНрд╕, рдЕрдм рдпрд╣ рдЪрд┐рд╣реНрдирд┐рдд рдЕрдк рдЬреЙрдиреНрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдиреЛрдВ рдХреЛ "рд╕рдВрдпреБрдХреНрдд рдорд╛рдорд▓реЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдлрд╝реЙрд░реНрдо рдХреЛ рд▓реЗрдВ:
case-identifier1 [of [ fieldname1 : ] type1 [ * [ fieldname2 : ] type2 тАж]
рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднрдпрднреАрдд рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдШрдЯрддрд╛ рд╣реИ рдПрдХ рд▓реЗрдмрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЛ рджреВрд╕рд░реЛрдВ рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХреЗ (рдкреНрд░рддрд┐рд╖реНрдард┐рдд), рдФрд░ рд╕рдВрдпреЛрдЬрди рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ред рдирд╛рдо рдХреЗ рдХреБрдЫ рдирд┐рдпрдо рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐
- рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
- рдпрд╣ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд▓рдп рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЦрд░рд╛рдм рдЖрдИрдбреА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрди рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдХреБрдЫ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИред
type LabelUnionType = Int of int | String of string
рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдШреЛрдВ
рддреЛ рдПрдХреАрдХрд░рдг рдХрд╛ рдорд╛рдорд▓рд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП? рдЦреИрд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВ, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
let currentLabelUnionType1 = 13 printfn "let currentLabelUnionType1 = 13" printfn "%O" currentLabelUnionType1 let currentLabelUnionType2 = Int 23 printfn "let currentLabelUnionType2 = Int 23" printfn "%O" currentLabelUnionType2 printfn "%A" currentLabelUnionType2 let currentLabelUnionType3 = "Cat" printfn "let currentLabelUnionType3 = \"Cat\"" printfn "%O" currentLabelUnionType3 printfn "%A" currentLabelUnionType3 let currentLabelUnionType4 = String "Cat" printfn "let currentLabelUnionType4 = String \"Cat\"" printfn "%O" currentLabelUnionType4 printfn "%A" currentLabelUnionType4
рдЬрдм рдкреНрд░рд┐рдВрдЯрдлрд╝рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдиреАрдЪреЗ% A рдпрд╛% O рдкреНрд░рд┐рдВрдЯрдлрд╝рди рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

рддреБрдо рдмрд╣реБрдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдЧрд╛рдбрд╝реА
- рдкреНрд░рд▓реЗрдЦрди
- рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░
рдПрдХрдорд╛рддреНрд░ рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдпреВрдирд┐рдпрди рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╕рдВрдШ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рддреБрдЪреНрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
type unionUsingTuples = CCY of (int * String) | Rates of (int * decimal) ..... ..... let tupledUnion = (12, "GBP")
рдЦрд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ
рдЖрдк рдЦрд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рдХреМрди рд╕реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдХ .NET рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рдЕрдзрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
type Player = Cross | Nought .... .... let emptyUnion = Cross
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ
рдИрдЧрд▓ рдЖрдВрдЦ, рдЖрдк рдХреА рддрд░рд╣, рд╕рдорд╕реНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛:
type PurchaseOrders = Orders of (string * int) | Empty type ClientOrders = Orders of (string * int) | Empty
рдпрд╣ рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛ред рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реАрдорд╛рдВрдХрд┐рдд рдЧрдардмрдВрдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрджрдо рдЖрдЧреЗ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ):
let purchaseOrders = PurchaseOrders.Orders ("box of 100 scrubbing brushes", 1) let clientOrders = ClientOrders.Orders ("scrubbing brush", 23)
рддреБрд▓рдирд╛
рдХрдИ рдПрдл # рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╕реАрдорд╛рдВрдХрд┐рдд рдЬреЛрдбрд╝ рд╕рдорд╛рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐
- рдЙрдирдХреЗ рд╕рдВрдпреБрдХреНрдд рдорд╛рдорд▓реЗ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдорд╛рди рд╣реИред
- рдЙрдирдХреЗ рд╕рдВрдШ рдорд╛рдорд▓реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред
- рд╕рдВрдШ рдХреЗ рдЙрдирдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдореВрд▓реНрдп рд╕рдорд╛рди рд╣реИрдВред
рди рдХреЗ рдмрд░рд╛рдмрд░
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдБ рд╕рдорд╛рдирддрд╛ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
let purchaseOrders1 = PurchaseOrders.Orders ("box of 100 scrubbing brushes", 1) let purchaseOrders2 = PurchaseOrders.Orders ("10 pack of disks", 1) printfn "purchaseOrders1 = purchaseOrders2 %A" (purchaseOrders1 = purchaseOrders2)

рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдпрд╣рд╛рдБ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣ рдирд┐рдпрдорд┐рдд .NET рдХреЛрдб рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрджрд┐ рд╕рджрд╕реНрдп рд╕рдорд╛рди рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдорд╛рди рдФрд░ рдЙрдирдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ (рдпрджрд┐ рд╣рдо рд╣реИрд╢ рдХреЛрдб рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ):
let purchaseOrders1 = PurchaseOrders.Orders ("box of 100 scrubbing brushes", 1) let purchaseOrders2 = PurchaseOrders.Orders ("box of 100 scrubbing brushes", 1) printfn "purchaseOrders1 = purchaseOrders2 %A" (purchaseOrders1 = purchaseOrders2)

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

рддреБрд▓рдирд╛ рдкреИрдЯрд░реНрди
рдиреАрдЪреЗ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдПрдХ рдХрд╛рд░реНрдб рдпреВрдирд┐рдпрди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдпреВрдирд┐рдпрди рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рдпреВрдирд┐рдЯ (рд╢реВрдиреНрдп, рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рдпрд╣ рдпрд╛рдж рд╣реИ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
type Card = ValueCard of int | Jack | Queen | King | Ace .... .... let cardFunction card = match card with | ValueCard i -> printfn "its a value card of %A" i | Jack -> printfn "its a Jack" | Queen -> printfn "its a Jack" | King -> printfn "its a Jack" | Ace -> printfn "its a Ace" () //return unit //shows you how to pass it in without a Let binding do cardFunction (Card.ValueCard 8) //or you could use explicit Let binding if you do desire let aceCard = Ace do cardFunction aceCard

рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ
рддреЛ рдЕрдм рд╣рдордиреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рд╕рдВрдШ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рддреЛ, рдЖрдкрдХреА рд░рд╛рдп рдореЗрдВ, рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ F # рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рдЪрд┐рдиреНрд╣рд┐рдд рдЬреЛрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ C # / VB.NET рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЬрд╡рд╛рдм: рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ред рдореИрдВ
рдЗрдВрдЯрд░реЙрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╣реАрдВ рдкрд░ рдПрдХ рдкреВрд░реА рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рд╕реЛрдЪрд╛ рдХрд┐ рд▓реЗрдмрд▓ рдХреЗ рдЬреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдЕрднреА рдЗрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдорд╛рдирдХ .NET рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╣рдо рдЬреЛ рдХреБрдЫ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред
рддреЛ, рдЖрдЗрдП рдКрдкрд░ рдХрд╛рд░реНрдб рд▓реЗрдВ, рдЬреЛ рдпрд╣ рдХреЛрдб рдерд╛:
type Card = ValueCard of int | Jack | Queen | King | Ace
рдФрд░ рдЗрд╕реЗ рдПрдХ decompiler рдЬреИрд╕реЗ Reflector / DotPeek (рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рднреА) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдПрдВред рдореИрдВрдиреЗ DotPeek рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ C # рдХреЛрдб рдХреЛ рдЗрд╕ рдПрдХрд▓ F # рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, F # рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ F # рдкреНрд░рдХрд╛рд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ .NET рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕реЗ C # / VB.NETред
using Microsoft.FSharp.Core; using System; using System.Collections; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [CompilationMapping(SourceConstructFlags.Module)] public static class Program { [EntryPoint] public static int main(string[] argv) { return 0; } [DebuggerDisplay("{__DebugDisplay(),nq}")] [CompilationMapping(SourceConstructFlags.SumType)] [Serializable] [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] public class Card : IEquatable<Program.Card>, IStructuralEquatable, IComparable<Program.Card>, IComparable, IStructuralComparable { [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int Tag { [DebuggerNonUserCode] get { return this._tag; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsValueCard { [DebuggerNonUserCode] get { return this.get_Tag() == 0; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static Program.Card Jack { [CompilationMapping(SourceConstructFlags.UnionCase, 1)] get { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Jack; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsJack { [DebuggerNonUserCode] get { return this.get_Tag() == 1; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static Program.Card Queen { [CompilationMapping(SourceConstructFlags.UnionCase, 2)] get { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Queen; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsQueen { [DebuggerNonUserCode] get { return this.get_Tag() == 2; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static Program.Card King { [CompilationMapping(SourceConstructFlags.UnionCase, 3)] get { // ISSUE: reference to a compiler-generated field return Program.Card._unique_King; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsKing { [DebuggerNonUserCode] get { return this.get_Tag() == 3; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static Program.Card Ace { [CompilationMapping(SourceConstructFlags.UnionCase, 4)] get { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Ace; } } [CompilerGenerated] [DebuggerNonUserCode] [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsAce { [DebuggerNonUserCode] get { return this.get_Tag() == 4; } } static Card() { } [CompilationMapping(SourceConstructFlags.UnionCase, 0)] public static Program.Card NewValueCard(int item) { return (Program.Card) new Program.Card.ValueCard(item); } [CompilationMapping(SourceConstructFlags.UnionCase, 1)] public static Program.Card get_Jack() { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Jack; } [CompilationMapping(SourceConstructFlags.UnionCase, 2)] public static Program.Card get_Queen() { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Queen; } [CompilationMapping(SourceConstructFlags.UnionCase, 3)] public static Program.Card get_King() { // ISSUE: reference to a compiler-generated field return Program.Card._unique_King; } [CompilationMapping(SourceConstructFlags.UnionCase, 4)] public static Program.Card get_Ace() { // ISSUE: reference to a compiler-generated field return Program.Card._unique_Ace; } public static class Tags { public const int ValueCard = 0; public const int Jack = 1; public const int Queen = 2; public const int King = 3; public const int Ace = 4; } [DebuggerTypeProxy(typeof (Program.Card.ValueCard\u0040DebugTypeProxy))] [DebuggerDisplay("{__DebugDisplay(),nq}")] [Serializable] [SpecialName] public class ValueCard : Program.Card { [CompilationMapping(SourceConstructFlags.Field, 0, 0)] [CompilerGenerated] [DebuggerNonUserCode] public int Item { [DebuggerNonUserCode] get { return this.item; } } } [SpecialName] internal class ValueCard\u0040DebugTypeProxy { [CompilationMapping(SourceConstructFlags.Field, 0, 0)] [CompilerGenerated] [DebuggerNonUserCode] public int Item { [DebuggerNonUserCode] get { return this._obj.item; } } } } }
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЗ (рд╡реГрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛рдПрдВ)
рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдЬреЛрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрд░реАрдХреЗ рд╕реЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рдВрдШ рд╕реНрд╡рдпрдВ рдХреЛ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЪрд┐рд╣реНрдирд┐рдд рдкреЗрдбрд╝реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐:
- рдЧрдгрд┐рдд рдХреЗ рднрд╛рд╡
- рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдХреЗ рдкреЗрдбрд╝
- Xml
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, MSDN рдХреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВредрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ, рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдмрд▓ рдпреВрдирд┐рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдШ рдореЗрдВ рджреЛ рдорд╛рдорд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ: рдиреЛрдб, рдЬреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рд╣реИ рдФрд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдЙрдкрд╢реАрд░реНрд╖рдХ, рдФрд░ рдЯрд┐рдк, рдЬреЛ рдкреЗрдбрд╝ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ myTree рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:

рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдЬреЛрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдИрдЯреНрд░реА рдХреЛ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЪрд┐рд╣реНрдирд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреИрд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╛ рддреЛ рд╕рдВрдпреЛрдЬрди рдХреЗ рдорд╛рдорд▓реЗ
- рдЯрд┐рдк (рдЦрд╛рд▓реА рдпреВрдирд┐рдпрди, .NET рдореЗрдВ рдорд╛рдирдХ рдЧрдгрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ)
- рдпрд╛ рдПрдХ рдирдВрдмрд░, рдЯреНрд░реА, рдЯреНрд░реА рд╕реЗ 3 рдЕрдВрдХреЛрдВ рдХрд╛ рдЯрдкрд▓
рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдорд┐рдЯ рдлрд╝рдВрдХреНрд╢рди рдХреАрд╡рд░реНрдб рд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдпрд╣ рдЬрд╛рджреВ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдЦреИрд░, рдпрд╣ рдЙрди рдЕрдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдорд┐рдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ "rec" рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛, F # рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рд╣рдо рдЕрдЪреНрдЫреЗ рд▓реЛрдЧ рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ
type Tree = | Tip | Node of int * Tree * Tree .... .... .... .... let rec sumTree tree = match tree with | Tip -> 0 | Node(value, left, right) -> value + sumTree(left) + sumTree(right) let myTree = Node(0, Node(1, Node(2, Tip, Tip), Node(3, Tip, Tip)), Node(4, Tip, Tip)) let resultSumTree = sumTree myTree printfn "Value of sumTree is %A" resultSumTree

MSDN рдХрд╛ рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреЛрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ (рд╣рд╛рдБ, рдореИрдВ рдЕрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрд▓рдХрд░ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд▓реЛрдЧ / рд▓рдбрд╝рдХрд┐рдпрд╛рдВ рдЗрд╕ рдЙрдзрд╛рд░ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреБрдЫ рдирд┐рдХрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдзрд╛рд░ рд╣реВрдВ, рдореИрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ)ред рдЖрдЗрдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ:
type Expression = | Number of int | Add of Expression * Expression | Multiply of Expression * Expression | Variable of string .... .... .... let rec Evaluate (env:Map<string,int>) exp = match exp with | Number n -> n | Add (x, y) -> Evaluate env x + Evaluate env y | Multiply (x, y) -> Evaluate env x * Evaluate env y | Variable id -> env.[id] let environment = Map.ofList [ "a", 1 ; "b", 2 ; "c", 3 ] // Create an expression tree that represents // the expression: a + 2 * b. let expressionTree1 = Add(Variable "a", Multiply(Number 2, Variable "b")) // Evaluate the expression a + 2 * b, given the // table of values for the variables. let result = Evaluate environment expressionTree1 printfn "Value of sumTree is %A" result
