рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╕реЛрдЪред рднрд╛рдЧ резрез: рдЕрдВрддрд┐рдо

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



рдореИрдВ @kleidemos рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рд▓реЗрдЦреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдореБрдЦреНрдп рдЕрдиреБрд╡рд╛рджрдХ рдФрд░ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж!





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


рд╕реНрдЯреИрдХ рдкрд░ рд╕рд░рд▓ рд╕рдВрдЧрдгрдирд╛ рдХреА рдпреЛрдЬрдирд╛:



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


EMPTY ONE THREE ADD TWO MUL SHOW 

рд╢рд╛рдпрдж рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред


рд╕реНрдЯреИрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░


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


 type Stack = float list 

рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреГрд╢реНрдп рдХреЛ рдЕрдзрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХрд▓ рдХреЗрд╕ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:


 type Stack = StackContents of float list 

рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ, рдЖрдк рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ StackContents рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд╕реНрдЯреИрдХ рдмрдирд╛рдПрдВ:


 let newStack = StackContents [1.0;2.0;3.0] 

рдореМрдЬреВрджрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, StackContents рдореЗрд▓ рдЦрд╛рддреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 let (StackContents contents) = newStack //  "contents"   // float list = [1.0; 2.0; 3.0] 

рдкреБрд╢ рдХрд╛рд░реНрдп


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


рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:


 let push x aStack = let (StackContents contents) = aStack let newContents = x::contents StackContents newContents 

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред


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


 Input: Stack   -  Output:  Stack 

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


рдЕрдВрдд рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ let рдмрдЬрд╛рдп, рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг:


 let push x (StackContents contents) = StackContents (x::contents) 

рдмрд╣реБрдд рдмреЗрд╣рддрд░!


рд╡реИрд╕реЗ, рдЙрд╕рдХреЗ рд╕реБрдВрджрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреЗрдЦреЗрдВ:


 val push : float -> Stack -> Stack 

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


рдПрдХ рддрд░реАрдХрд╛ рдпрд╛ рджреВрд╕рд░рд╛, рдЬрд╛рдВрдЪреЗрдВ:


 let emptyStack = StackContents [] let stackWith1 = push 1.0 emptyStack let stackWith2 = push 2.0 stackWith1 

рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!


рдкреБрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реАрд░реНрд╖ рд╕реБрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдЯреИрдХ рдХрд░реЗрдВ


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


 let ONE stack = push 1.0 stack let TWO stack = push 2.0 stack 

рд▓реЗрдХрд┐рди рдПрдХ рдорд┐рдирдЯ рд░реБрдХрд┐рдП! рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ stack рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 let ONE = push 1.0 let TWO = push 2.0 let THREE = push 3.0 let FOUR = push 4.0 let FIVE = push 5.0 

рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ push рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдерд╛, рддреЛ stack рдХреЛ рджреЛ рдмрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ рдЬреЛ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреИрдХ рдмрдирд╛рддрд╛ рд╣реИ:


 let EMPTY = StackContents [] 

рдкреНрд░рд╛рдкреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


 let stackWith1 = ONE EMPTY let stackWith2 = TWO stackWith1 let stackWith3 = THREE stackWith2 

рдХреНрдпрд╛ рдпреЗ рдордзреНрдпрд╡рд░реНрддреА рдвреЗрд░ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИрдВ? рдХреНрдпрд╛ рдЗрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдмреЗрд╢рдХ! рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ, рджреЛ рдФрд░ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ:


 Stack -> Stack 

рддреЛ, рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ! рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдирд┐рдореНрди рдореЗрдВ рдЗрдирдкреБрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 let result123 = EMPTY |> ONE |> TWO |> THREE let result312 = EMPTY |> THREE |> ONE |> TWO 

рдвреЗрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛


рд╕реНрдЯреИрдХ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рдкрддрд╛ рд▓рдЧрд╛, рд▓реЗрдХрд┐рди pop рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рд╕реНрдЯреИрдХ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ?


рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╢реИрд▓реА рдореЗрдВ, рдЙрддреНрддрд░ рд╣рд╛рдВ рд╣реИ ред рд▓реЗрдХрд┐рди рдУрдУрдкреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдвреЗрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рд╢реАрд░реНрд╖ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ, рд╕реНрдЯреИрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред рд╢реАрд░реНрд╖ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ - рдЗрд╕ рддрддреНрд╡ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рд╕реНрдЯреИрдХ рдмрдирд╛рдПрдВред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдирдП рдШрдЯреЗ рд╣реБрдП рд╕реНрдЯреИрдХ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╢реАрд░реНрд╖ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, pop рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рдорд╛рди, рд╢реАрд░реНрд╖ рддрддреНрд╡ рдФрд░ рдирдпрд╛ рд╕реНрдЯреИрдХ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред F # рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЯреБрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 ///     ///          let pop (StackContents contents) = match contents with | top::rest -> let newStack = StackContents rest (top,newStack) 

рдкрд░рд┐рдгрд╛рдореА рдлрд╝рдВрдХреНрд╢рди рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред


рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, contents рд╕реАрдзреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИред


рдлрд┐рд░, рд╕рд╛рдордЧреНрд░реА рдХреА contents рдХрд╛ match..with рд╣реИред


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


рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА!
рд╕рдВрдХрд▓рдХ рдиреЗ рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрджрд┐ рд╕реНрдЯреИрдХ рдЦрд╛рд▓реА рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред



рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдЦрд╛рд▓реА рдорд╛рдорд▓реЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП pop рдХрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг:


 let pop (StackContents contents) = match contents with | top::rest -> let newStack = StackContents rest (top,newStack) | [] -> failwith "Stack underflow" 

рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


 let initialStack = EMPTY |> ONE |> TWO let popped1, poppedStack = pop initialStack let popped2, poppedStack2 = pop poppedStack 

рдФрд░ рдЕрдкрд╡рд╛рдж рдкрд░реАрдХреНрд╖рдг:


 let _ = pop EMPTY 

рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдп


рдЕрдм рдЬрдм рдЬреЛрдбрд╝ рдФрд░ рд╡рд┐рд▓реЛрдкрди рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк "рдРрдб" рдФрд░ "рдЧреБрдгрд╛" рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 let ADD stack = let x,s = pop stack //   let y,s2 = pop s //    let result = x + y //   push result s2 //     let MUL stack = let x,s = pop stack //   let y,s2 = pop s //    let result = x * y //   push result s2 //     

рдСрдирд▓рд╛рдЗрди рдкрд░реАрдХреНрд╖рдг:


 let add1and2 = EMPTY |> ONE |> TWO |> ADD let add2and3 = EMPTY |> TWO |> THREE |> ADD let mult2and3 = EMPTY |> TWO |> THREE |> MUL 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!


рд╕рдордп рдирд┐рдХрд╛рд▓рдХрд░ ...


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдб рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░рд╛рд╢рд┐ рдХреА рдирдХрд▓ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


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


 let binary mathFn stack = //    let y,stack' = pop stack //     let x,stack'' = pop stack' //  let z = mathFn xy //      push z stack'' 

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


рдкреНрд░рд╢реНрди: stack рдмрд╛рдж рдЖрдиреЗ рд╡рд╛рд▓реЗ mathFn рдмрдЬрд╛рдп рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЖрджреЗрд╢ рдХреНрдпреЛрдВ рд╣реИ?


рдЕрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ binary рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ ADD рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:


binary рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ADD рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕:


 let ADD aStack = binary (fun xy -> x + y) aStack 

рд▓реЗрдХрд┐рди рдЖрдк рд▓рдВрдмреЛрджрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди + рдХреА рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:


 let ADD aStack = binary (+) aStack 

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


 let ADD = binary (+) 

рдЕрдиреНрдп рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛:


 let SUB = binary (-) let MUL = binary (*) let DIV = binary (../) 

рдЗрд╕реЗ рдСрдирд▓рд╛рдЗрди рдЖрдЬрд╝рдорд╛рдПрдВ:


 let div2by3 = EMPTY |> THREE|> TWO |> DIV let sub2from5 = EMPTY |> TWO |> FIVE |> SUB let add1and2thenSub3 = EMPTY |> ONE |> TWO |> ADD |> THREE |> SUB 

рдЗрд╕реА рддрд░рд╣, рдЖрдк рдПрдХрддрд░рдлрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ


 let unary f stack = let x,stack' = pop stack push (fx) stack' 

рдФрд░ рдХреБрдЫ рдПрдХрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:


 let NEG = unary (fun x -> -x) let SQUARE = unary (fun x -> x * x) 

рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдореЛрдб:


 let neg3 = EMPTY |> THREE|> NEG let square2 = EMPTY |> TWO |> SQUARE 

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ | рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ SHOW рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред


 let SHOW stack = let x,_ = pop stack printfn "The answer is %f" x stack //       

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, pop рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреИрдХ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореВрд▓ рд╕реНрдЯреИрдХ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдерд╛ред


рдЕрдВрдд рдореЗрдВ, рдЖрдк рдореВрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ


 EMPTY |> ONE |> THREE |> ADD |> TWO |> MUL |> SHOW 

рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ


рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


рдЖрдк рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 ///      let DUP stack = //    let x,_ = pop stack //      push x stack ///      let SWAP stack = let x,s = pop stack let y,s' = pop s push y (push x s') ///    let START = EMPTY 

рдЗрди рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХреБрдЫ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 START |> ONE |> TWO |> SHOW START |> ONE |> TWO |> ADD |> SHOW |> THREE |> ADD |> SHOW START |> THREE |> DUP |> DUP |> MUL |> MUL // 27 START |> ONE |> TWO |> ADD |> SHOW // 3 |> THREE |> MUL |> SHOW // 9 |> TWO |> SWAP |> DIV |> SHOW // 9 div 2 = 4.5 

рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ:


 Stack -> Stack 

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


рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:


 //    let ONE_TWO_ADD = ONE >> TWO >> ADD START |> ONE_TWO_ADD |> SHOW //    let SQUARE = DUP >> MUL START |> TWO |> SQUARE |> SHOW //     let CUBE = DUP >> DUP >> MUL >> MUL START |> THREE |> CUBE |> SHOW //   let SUM_NUMBERS_UPTO = DUP // n >> ONE >> ADD // n+1 >> MUL // n(n+1) >> TWO >> SWAP >> DIV // n(n+1) / 2 START |> THREE |> SQUARE |> SUM_NUMBERS_UPTO |> SHOW 

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


рдХрдиреНрд╡реЗрдпрд░ рдмрдирд╛рдо рд░рдЪрдирд╛


рд╣рдордиреЗ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рджреЗрдЦреЗ; рдХрдиреНрд╡реЗрдпрд░ рдФрд░ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдлрд░реНрдХ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?


рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдХ рдорд╛рдпрдиреЗ рдореЗрдВ, "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди" рдСрдкрд░реЗрд╢рди рд╣реИред рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдордп, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдЯреИрдХ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреБрд░рдВрдд рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рджреВрд╕рд░реА рдУрд░, рд░рдЪрдирд╛ рдПрдХ "рдпреЛрдЬрдирд╛" рдХреА рддрд░рд╣ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реАрдзреЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд┐рдирд╛ рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


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


 let COMPOSED_SQUARE = DUP >> MUL 

рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред


 let PIPED_SQUARE = DUP |> MUL 

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


 let stackWith2 = EMPTY |> TWO let twoSquared = stackWith2 |> DUP |> MUL 

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


"рдпреЛрдЬрдирд╛" рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдВрдмреЛрджрд░ рдХреЛ рдЕрдзрд┐рдХ рдЖрджрд┐рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ:


 let LAMBDA_SQUARE = unary (fun x -> x * x) 

рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ (рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рд╕рдВрднрд╡ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдЦреЛ рдЬрд╛рддреА рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛рдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!


рдкреВрд░реНрдг рдХреЛрдб


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХреЛрдб:


 // ============================================== //  // ============================================== type Stack = StackContents of float list // ============================================== //   // ============================================== ///     let push x (StackContents contents) = StackContents (x::contents) ///        ///       let pop (StackContents contents) = match contents with | top::rest -> let newStack = StackContents rest (top,newStack) | [] -> failwith "Stack underflow" // ============================================== //  () // ============================================== //     //      //     let binary mathFn stack = let y,stack' = pop stack let x,stack'' = pop stack' let z = mathFn xy push z stack'' //    //      //     let unary f stack = let x,stack' = pop stack push (fx) stack' // ============================================== //  () // ============================================== ///      let SHOW stack = let x,_ = pop stack printfn "The answer is %f" x stack //      ///    let DUP stack = let x,s = pop stack push x (push xs) ///      let SWAP stack = let x,s = pop stack let y,s' = pop s push y (push x s') ///    let DROP stack = let _,s = pop stack //   s //   // ============================================== // ,    // ============================================== //  // ------------------------------- let EMPTY = StackContents [] let START = EMPTY //  // ------------------------------- let ONE = push 1.0 let TWO = push 2.0 let THREE = push 3.0 let FOUR = push 4.0 let FIVE = push 5.0 //   // ------------------------------- let ADD = binary (+) let SUB = binary (-) let MUL = binary (*) let DIV = binary (../) let NEG = unary (fun x -> -x) // ============================================== // ,     // ============================================== let SQUARE = DUP >> MUL let CUBE = DUP >> DUP >> MUL >> MUL let SUM_NUMBERS_UPTO = DUP // n >> ONE >> ADD // n+1 >> MUL // n(n+1) >> TWO >> SWAP >> DIV // n(n+1) / 2 

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреИрдХ рдЖрдзрд╛рд░рд┐рдд рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд╣реИред рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ, рдХреБрдЫ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди ( push , pop , binary , unary ) рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдкреВрд░реНрдг-рдирд┐рд░реНрдорд┐рдд DSL рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред


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


рдореБрдЭреЗ рдПрд╢рд▓реЗ рдлреЗрдирд┐рдпрд▓реЛ рдХреЗ рднрд╡реНрдп рдмреНрд▓реЙрдЧ рдХреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛ред рдпрджрд┐ рдЖрдк F # рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрдХрд░рдг рдореЗрдВ рдЧрд╣рд░рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рдордЬрд╛ рдЖ рдЧрдпрд╛!


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


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



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


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


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



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


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

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


All Articles