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

рд╕рд╣рдпреЛрдЧ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛
рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
let F xyz = xyz
рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди y
рдХреЛ рддрд░реНрдХ z
рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо x
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛рдиреА:
let F xyz = x (yz)
рдпрд╛ рдлрд╝рдВрдХреНрд╢рди x
рдХреЛ рддрд░реНрдХ y
рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрд░реНрдХ z
рд╕рд╛рде рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╛рдиреА:
let F xyz = (xy) z
- рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рд╣реИред
- рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдиреЗ рд╕рдВрдмрджреНрдзрддрд╛ рдЫреЛрдбрд╝ рджреА рд╣реИ ред
xyz
рдЕрд░реНрде рд╣реЛрддрд╛ рд╣реИ (xy) z
ред- рдФрд░
wxyz
, ((wx) y) z
рдмрд░рд╛рдмрд░ рд╣реИред - рдпрд╣ рдХрдорд╛рд▓ рдирд╣реАрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- рдпрджрд┐ рд╣рдо
x
рдХреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ (xy) z
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдПрдХ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рддрд░реНрдХ z
рдХреЛ рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд╣реА рд╕рдВрдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреЛрд╖реНрдардХ рдпрд╛ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╕рдорддреБрд▓реНрдп рд╣реИрдВ:
let F xyz = x (yz) let F xyz = yz |> x // let F xyz = x <| yz //
рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╕рдорд╛рд░реЛрд╣ рд░рдЪрдирд╛
рд╣рдордиреЗ рдХрдИ рдмрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдпрд╣ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рднрдпрд╛рд╡рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди "f" рд╣реИ рдЬреЛ "T1" рдкреНрд░рдХрд╛рд░ "T2" рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди "рдЬреА" рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк "рдЯреА 2" рдХреЛ "рдЯреА 3" рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо "рдПрдл" рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ "рдЬреА" рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдк "рдЯреА 1" рдХреЛ "рдЯреА 3" рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
let f (x:int) = float x * 3.0 // f - int->float let g (x:float) = x > 4.0 // g - float->bool
рд╣рдо рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди "рдПрдЪ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ "рдПрдл" рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "рдЬреА" рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
let h (x:int) = let y = f(x) g(y) // g
рдереЛрдбрд╝рд╛ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ:
let h (x:int) = g ( f(x) ) // h int->bool // h 1 h 2
рдЕрдм рддрдХ, рдЗрддрдирд╛ рд╕рд░рд▓ред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣рдо рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди "рдХрдВрдкреЛрдЬрд╝" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди "рдПрдл" рдФрд░ "рдЬреА" рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рднреА рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреА рд╣реИред
let compose fgx = g ( f(x) )
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ " f
" рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ 'a
рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ 'b
рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рдФрд░ ' g
' рдЯрд╛рдЗрдк 'b
рдЗрдирдкреБрдЯ рддрдХ рд╕реАрдорд┐рдд рд╣реИ:
val compose : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд░рдЪрдирд╛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред)
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ " >>
" рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
let (>>) fgx = g ( f(x) )
рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
let add1 x = x + 1 let times2 x = x * 2 let add1Times2 x = (>>) add1 times2 x // add1Times2 3
рд╕реНрдкрд╖реНрдЯ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ x
рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░рдЪрдирд╛ рдПрдХ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рд▓реМрдЯрд╛рдПрдЧреАред
let add1Times2 = (>>) add1 times2
рджреВрд╕рд░реА рдмрд╛рдд, рдХреНрдпреЛрдВрдХрд┐ >>
рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
let add1Times2 = add1 >> times2
рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреНрд▓реАрдирд░ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
let add1 x = x + 1 let times2 x = x * 2 // let add1Times2 x = times2(add1 x) // let add1Times2 = add1 >> times2
рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд░рдЪрдирд╛ рд╕рдВрдЪрд╛рд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХрдВрдкреЛрдЬрд┐рд╢рди рдСрдкрд░реЗрдЯрд░ (рд╕рднреА рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рддрд░рд╣) рдХреЗ рдкрд╛рд╕ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рддрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ "рдРрдб" рдФрд░ "рдЯрд╛рдЗрдореНрд╕" рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд░рдЪрдирд╛ рдХреЗ рджреМрд░рд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
let add nx = x + n let times nx = x * n let add1Times2 = add 1 >> times 2 let add5Times3 = add 5 >> times 3 // add5Times3 1
рдЬрдм рддрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
let twice f = f >> f // ('a -> 'a) -> ('a -> 'a)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ " f
" рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рдЕрдм " +
" рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛, рдЗрдирдкреБрдЯ (int->int)
рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (int->int)
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, " +
" рдХрд╛ рдЙрдкрдпреЛрдЧ " twice
" рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
let add1 = (+) 1 // (int -> int) let add1Twice = twice add1 // (int -> int) // add1Twice 9
рджреВрд╕рд░реА рдУрд░, рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
let addThenMultiply = (+) >> (*)
рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдкреБрдЯ "*" рдПрдХ int
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ int->int
рдлрд╝рдВрдХреНрд╢рди (рдЬреЛ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рд╣реИ)ред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ int
рд╡рд╛рдкрд╕ рдЖрдП, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛:
let add1ThenMultiply = (+) 1 >> (*) // (+) 1 (int -> int) 'int' // add1ThenMultiply 2 7
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд░рдЪрдирд╛ рдХреЛ " <<
" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
let times2Add1 = add 1 << times 2 times2Add1 3
рд░рд┐рд╡рд░реНрд╕ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА ("рдЕрдВрдЧреНрд░реЗрдЬреА рдЬреИрд╕рд╛") рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
let myList = [] myList |> List.isEmpty |> not // myList |> (not << List.isEmpty) //
рд░рдЪрдирд╛ рдмрдирд╛рдо рдХрдиреНрд╡реЗрдпрд░
рдЖрдк рд░рдЪрдирд╛ рдФрд░ рдХрдиреНрд╡реЗрдпрд░ рдХреЗ рдмреАрдЪ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦреЗрдВ:
let (|>) xf = fx
рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдирд╣реАрдВред рд╡рд╣ рд╕рдм рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдЗрдирдкреБрдЯ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯ рдореЗрдВ, рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ)ред рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
let doSomething xyz = x+y+z doSomething 1 2 3 // 3 |> doSomething 1 2 //
рд░рдЪрдирд╛ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЦреНрдпрд╛ 3 рднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдЖрдЙрдЯрдкреБрдЯ" рдХреЛ doSomething
рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
3 >> doSomething 1 2 // // f >> g g(f(x)) : doSomething 1 2 ( 3(x) ) // 3 ! // error FS0001: This expression was expected to have type 'a->'b // but here has type int
рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдорд╛рди "3" рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди 'a->'b
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреА рддреБрд▓рдирд╛ рд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ 3 рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдкрд╣рд▓реЗ рджреЛ рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
let (>>) fgx = g ( f(x) ) let add nx = x + n let times nx = x * n let add1Times2 = add 1 >> times 2
рд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, " add 1
" (рдЖрдВрд╢рд┐рдХ) рдлрд╝рдВрдХреНрд╢рди int->int
, рдЬрд┐рд╕реЗ " times 2
" рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
let add1Times2 = add 1 |> times 2 // // x |> f f(x) : let add1Times2 = times 2 (add 1) // add1 'int' // error FS0001: Type mismatch. 'int -> int' does not match 'int'
рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ " times 2
" рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ int->int
, рдЕрд░реНрдерд╛рддреНред рдПрдХ рдлрдВрдХреНрд╢рди (int->int)->'a
ред
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди
F # рдХреЗ рд▓рд┐рдП рдХрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ C # рдпрд╛ Java рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк F # рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ:
F # рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдПрдл # рд╕рдореБрджрд╛рдп рдмрд╣реБрдд рд╢реБрд░реБрдЖрддреА рдЕрдиреБрдХреВрд▓ рд╣реИред рд╕реНрд▓реИрдХ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рдЪреИрдЯ рд╣реИ, рдПрдл # рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд╢реБрд░реБрдЖрддреА рдХрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ!
рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп F # рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдирд╛ рди рднреВрд▓реЗрдВ! рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрдирд╕реЗ рдЪреИрдЯ рд░реВрдо рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА:
рдЕрдиреБрд╡рд╛рдж рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
@Kleidemos рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд
рдЕрдиреБрд╡рд╛рдж рдФрд░ рд╕рдВрдкрд╛рджрдХреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдПрдл # рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдереЗред рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @schvepsss рдФрд░ @shwars рдХреЛ рднреА рдзрдиреНрдпрд╡рд╛рдж рджреЗрддреЗ рд╣реИрдВ ред