рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╕реЛрдЪред рднрд╛рдЧ 3

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рддреАрд╕рд░реЗ рднрд╛рдЧ рдиреЗ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рд╣реИред рдЖрдЬ рд╣рдо рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдВрдЧреЗред рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдЯреМрддреА рдХреЗ рддрд╣рдд!




рдЕрдм рдЬрдм рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреБрдЫ рд╕рдордЭ рд╣реИ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдбреЛрдореЗрди рдФрд░ рд░реЗрдВрдЬ рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЧрд╣рди рд╡рд┐рд╕рд░реНрдЬрди рдХреЗ рд▓рд┐рдП "рдПрдл # рдкреНрд░рдХрд╛рд░ рд╕рдордЭрдиреЗ" рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдиреЛрдЯреЗрд╢рди рдХреА рдереЛрдбрд╝реА рдмреЗрд╣рддрд░ рд╕рдордЭ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдордиреЗ рдбреЛрдореЗрди рдФрд░ рд░реЗрдВрдЬ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реБрдП рддреАрд░ рд╕рдВрдХреЗрддрди " -> " рдХреЛ рджреЗрдЦрд╛ред рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 val functionName : domain -> range 

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреБрдЫ рдФрд░ рдЙрджрд╛рд╣рд░рдг:


 let intToString x = sprintf "x is %i" x //  int  string let stringToInt x = System.Int32.Parse(x) 

рдпрджрд┐ рдЖрдк рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 val intToString : int -> string val stringToInt : string -> int 

рдЙрдирдХрд╛ рдорддрд▓рдм рд╣реИ:


  • intToString рдореЗрдВ int рдХрд╛ рдПрдХ рдбреЛрдореЗрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк string рдХреА рд╕реАрдорд╛ рддрдХ рдореИрдк string ред
  • stringToInt рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ string рдХрд╛ рдПрдХ рдбреЛрдореЗрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ int рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИред

рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░


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


рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг


 let intToFloat x = float x // "float" -  int  float let intToBool x = (x = 2) // true  x  2 let stringToString x = x + " world" 

рдФрд░ рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░:


 val intToFloat : int -> float val intToBool : int -> bool val stringToString : string -> string 

рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди


рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдПрдл # рд╕рдВрдХрд▓рдХ рдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:


 let stringLength x = x.Length => error FS0072: Lookup on object of indeterminate type 

рд╕рдВрдХрд▓рдХ рддрд░реНрдХ "x" рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ "рд▓рдВрдмрд╛рдИ" рдПрдХ рд╡реИрдз рд╡рд┐рдзрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ F # рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ "рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди" рдкрд╛рд╕ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрдм рдЙрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк "x" рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред


 let stringLength (x:string) = x.Length 

x:string рдЪрд╛рд░реЛрдВ рдУрд░ рдмреНрд░реЗрд╕рд┐рдЬрд╝ x:string рдкреИрд░рд╛рдореАрдЯрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИ! рдЕрд░реНрдерд╛рддреН, рдПрдХ рдУрдкрди рдХреЛрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


 let stringLengthAsInt (x:string) :int = x.Length 

рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ x рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред


рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░


рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди ( рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрднреА - рдХрднреА HOF рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЕрдореВрд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗред рдПрдл # рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рдЖрдо рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдлрд╝рдВрдХреНрд╢рди evalWith5ThenAdd2 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ 5 рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ 2 рдЬреЛрдбрд╝рддрд╛ рд╣реИ:


 let evalWith5ThenAdd2 fn = fn 5 + 2 //   ,   fn(5) + 2 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 val evalWith5ThenAdd2 : (int -> int) -> int 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреЛрдореЗрди (int->int) рдФрд░ рд░реЗрдВрдЬ int ред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реЗрдХрд░ int рддрдХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ int ред


рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:


 let add1 x = x + 1 //  -  (int -> int) evalWith5ThenAdd2 add1 //   

рдФрд░:


 val add1 : int -> int val it : int = 8 

" add1 " рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ int рд╕реЗ int рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ evalWith5ThenAdd2 рд▓рд┐рдП рдПрдХ рд╡реИрдз рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо 8 рд╣реИред


рд╡реИрд╕реЗ, рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж " it " рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдореВрд▓реНрдп рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдереЗред рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рд╣реИред


рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛:


 let times3 x = x * 3 // -  (int -> int) evalWith5ThenAdd2 times3 //   

рдпрд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 val times3 : int -> int val it : int = 17 

" times3 " рднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ int рд╕реЗ int рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ evalWith5ThenAdd2 рд▓рд┐рдП рдПрдХ рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╣реИред рдЧрдгрдирд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо 17 рд╣реИред


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ float рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, int рдирд╣реАрдВ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕:


 let times3float x = x * 3.0 // -  (float->float) evalWith5ThenAdd2 times3float 

рд╕рдВрдХрд▓рдХ, рдЬрдм рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯреЗрдЧрд╛:


 error FS0001: Type mismatch. Expecting a int -> int but given a float -> float 

рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ int->int рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп


рдореВрд▓реНрдп рдХрд╛рд░реНрдп рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ "рдпреЛрдЬрдХ" рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рдПрдХ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред


 let adderGenerator numberToAdd = (+) numberToAdd 

рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░:


 val adderGenerator : int -> (int -> int) 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдПрдХ int рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ("рдпреЛрдЬрдХ") рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ ints рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 let add1 = adderGenerator 1 let add2 = adderGenerator 2 

рджреЛ рдпреЛрдЬрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдореЗрдВ 1 рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ 2. рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рдереЗред


 val add1 : (int -> int) val add2 : (int -> int) 

рдЕрдм рдЖрдк рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ:


 add1 5 // val it : int = 6 add2 5 // val it : int = 7 

рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрд╛:


 let evalWith5ThenAdd2 fn = fn 5 +2 > val evalWith5ThenAdd2 : (int -> int) -> int 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, F # рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ " fn " int рдХреЛ int рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ int->int ред


рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЗ рдореЗрдВ "fn" рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реИ?


 let evalWith5 fn = fn 5 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ " fn " рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ int рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ? рд╕рдВрдХрд▓рдХ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


 let evalWith5AsInt (fn:int->int) = fn 5 let evalWith5AsFloat (fn:int->float) = fn 5 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 let evalWith5AsString fn :string = fn 5 

рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди string , рдлрд╝рдВрдХреНрд╢рди " fn " рднреА string рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, " fn " рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


"рдпреВрдирд┐рдЯ" рдЯрд╛рдЗрдк рдХрд░реЗрдВ


рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдХрднреА-рдХрднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдирд╛ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд┐рдП рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдлрд╝рдВрдХреНрд╢рди " printInt " рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред


 let printInt x = printf "x is %i" x //    

рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реИрдВ?


 val printInt : int -> unit 

рдПрдХ " unit " рдХреНрдпрд╛ рд╣реИ?


рднрд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЙрд╕реЗ рд░реЗрдВрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧрдгрд┐рдд рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ "рд╢реВрдиреНрдп" рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдореИрдкрд┐рдВрдЧ рд╣реИ, рдФрд░ рдореИрдкрд┐рдВрдЧ рдХреЛ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛!



рддреЛ, F # рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ " unit " рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ " () " рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ unit рдФрд░ () рдХреНрд░рдорд╢рдГ рд╕реА # рд╕реЗ "рд╢реВрдиреНрдп" рдФрд░ "рдирд▓" рдХреА рддрд░рд╣ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╡рд┐рдкрд░реАрдд, unit рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ () рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╣реИред рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:


 let whatIsThis = () 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ:


 val whatIsThis : unit = () 

рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдмрд▓ " whatIsThis " рдкреНрд░рдХрд╛рд░ рдХреА unit рдФрд░ рдПрдХ рдореВрд▓реНрдп () рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред


рдЕрдм, " printInt " рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ printInt , рд╣рдо рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдЕрд░реНрде рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ:


 val printInt : int -> unit 

рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ printInt рдореЗрдВ int рдХрд╛ рдПрдХ рдбреЛрдореЗрди рд╣реИ, рдЬреЛ рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реВрдЪрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдп


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


 let printHello = printf "hello world" //    

рдкрд░рд┐рдгрд╛рдо:


 hello world val printHello : unit = () 

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


 val aName: type = constant 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ printHello рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп () ред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


printInt рдФрд░ printHello рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? printInt рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ printInt рдорд╛рди рддрдм рддрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ x рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдереАред printHello рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреА рдЬрдЧрд╣ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХрдВрд╕реЛрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде () рдмрд░рд╛рдмрд░ рдерд╛ред


рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ, unit рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 let printHelloFn () = printf "hello world" //    

рдЕрдм рдЙрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрд░рд╛рдмрд░ рд╣реИ:


 val printHelloFn : unit -> unit 

рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ () рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 printHelloFn () 

рдЕрдирджреЗрдЦрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЗрдХрд╛рдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдордЬрдмреВрдд рдХрд░рдирд╛


рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдХ unit рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА:


 do 1+1 // => FS0020: This expression should have type 'unit' let something = 2+2 // => FS0020: This expression should have type 'unit' "hello" 

рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ ignore рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди unit ред рдЗрд╕ рдХреЛрдб рдХрд╛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 do (1+1 |> ignore) // ok let something = 2+2 |> ignore // ok "hello" 

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░


рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред F # рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП .NET рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


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


 let onAStick x = x.ToString() + " on a stick" 

рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ ToString() рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░:


 val onAStick : 'a -> string 

рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ 'a ? рдПрдл # рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдЕрдЬреНрдЮрд╛рдд рд╣реИред "рдП" рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред C # рдореЗрдВ рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдмрд░рд╛рдмрд░:


 string onAStick<a>(); //   string OnAStick<TObject>(); // F#-   'a    // C#'-   "TObject"   

рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдПрдл # рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИред рдпрд╣ Object рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп рдЙрдирдХреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ int , float рдФрд░ string рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


 onAStick 22 onAStick 3.14159 onAStick "hello" 

рдпрджрд┐ рджреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджреЗрдЧрд╛: 'a рдкрд╣рд▓реЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП 'b рдЖрджрд┐ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 let concatString xy = x.ToString() + y.ToString() 

рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ: 'a рдФрд░ 'b :


 val concatString : 'a -> 'b -> string 

рджреВрд╕рд░реА рдУрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдЬрдм рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, x рдФрд░ y рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:


 let isEqual xy = (x=y) 

рдЗрд╕рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ:


 val isEqual : 'a -> 'a -> bool 

рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдЬрдм рдпрд╣ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рд╛рд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рджреЗрдЦреЗрдВрдЧреЗред


рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░


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


  • Tuples (tuples)ред рдпрд╣ рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ, рдПрдХ рдЯреНрд░рд┐рдкрд▓, рдЖрджрд┐, рдЬреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмрдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ("hello", 1) рдПрдХ рдЯрдкрд▓ рд╣реИ рдЬреЛ string рдФрд░ int рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдЯреНрдпреВрд▓рд┐рдк рдХреА рдПрдХ рдмрд╛рдирдЧреА рд╣реИ; рдпрджрд┐ рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХрд╣реАрдВ рдПрдл # рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рдЯрдкрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
    рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдЯреБрдкрд▓реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ "рдЙрддреНрдкрд╛рджреЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛:

 string * int // ("hello", 1) 

  • рд╕рдВрдЧреНрд░рд╣ ред рд╕рдмрд╕реЗ рдЖрдо рд╣реИрдВ рд╕реВрдЪреА (рд╕реВрдЪреА), seq (рдЕрдиреБрдХреНрд░рдо) рдФрд░ рд╕рд░рдгреАред рд╕реВрдЪрд┐рдпрд╛рдБ рдФрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рдЖрдХрд╛рд░ рдореЗрдВ рддрдп рдХреА рдЧрдИ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреБрдХреНрд░рдо рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдирдВрдд рд╣реИрдВ (рджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреАрдЫреЗ, рдЕрдиреБрдХреНрд░рдо рд╕рдорд╛рди IEnumrable )ред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХреАрд╡рд░реНрдб рд╣реИрдВ: " list ", " seq " рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП " [] "ред

 int list // List type  [1;2;3] string list // List type  ["a";"b";"c"] seq<int> // Seq type  seq{1..10} int [] // Array type  [|1;2;3|] 

  • рд╡рд┐рдХрд▓реНрдк (рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░) ред рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдЧрд╛рдпрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: Some (рдЬрдм рдореВрд▓реНрдп рдореМрдЬреВрдж рд╣реИ) рдФрд░ None (рдЬрдм рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдХреАрд╡рд░реНрдб " option " рд╣реИ:

 int option // Some 1 

  • рдЪрд┐рд╣реНрдирд┐рдд рд╕рдВрдШ (рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ) ред рд╡реЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрдИ рд░реВрдкреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдордиреЗ "рдПрдл # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?" рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗред ред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдирд╛рдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИред
  • рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ (рд░рд┐рдХреЙрд░реНрдб) ред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд░рд╣, рдирд╛рдорд┐рдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рд╣рдордиреЗ "рдПрдл # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?" рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рднреА рджреЗрдЦреЗред ред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдирд╛рдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдХреАрд╡рд░реНрдб рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдордЭ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ


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


 let testA = float 2 let testB x = float 2 let testC x = float 2 + x let testD x = x.ToString().Length let testE (x:float) = x.ToString().Length let testF x = printfn "%s" x let testG x = printfn "%f" x let testH = 2 * 2 |> ignore let testI x = 2 * 2 |> ignore let testJ (x:int) = 2 * 2 |> ignore let testK = "hello" let testL() = "hello" let testM x = x=x let testN x = x 1 // :     x? let testO x:string = x 1 // :    :string ? 

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди


F # рдХреЗ рд▓рд┐рдП рдХрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ C # рдпрд╛ Java рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк F # рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ:



F # рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╡рд░реНрдгрд┐рдд рд╣реИрдВред


рдЕрдВрдд рдореЗрдВ, рдПрдл # рд╕рдореБрджрд╛рдп рдмрд╣реБрдд рд╢реБрд░реБрдЖрддреА рдЕрдиреБрдХреВрд▓ рд╣реИред рд╕реНрд▓реИрдХ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рдЪреИрдЯ рд╣реИ, рдПрдл # рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд╢реБрд░реБрдЖрддреА рдХрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ!


рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп F # рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдирд╛ рди рднреВрд▓реЗрдВ! рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрдирд╕реЗ рдЪреИрдЯ рд░реВрдо рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА:



рдЕрдиреБрд╡рд╛рдж рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


@Kleidemos рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд
рдЕрдиреБрд╡рд╛рдж рдФрд░ рд╕рдВрдкрд╛рджрдХреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдПрдл # рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдереЗред рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо @schvepsss рдФрд░ @ рд╢рд╛рд╡рд░ рдХрд╛ рднреА рд╢реБрдХреНрд░рд┐рдпрд╛ рдЕрджрд╛ рдХрд░рддреЗ рд╣реИрдВ ред

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


All Articles