OCaml рдХрд╛ рдкрд░рд┐рдЪрдп: рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░рдг [3]

[рд▓рдЧрднрдЧред рдкреНрд░рддрд┐: рдЕрдиреБрд╡рд╛рдж рдЬрд╛рд░реА рд░рдЦрд╛ред рдкрд╣рд▓рд╛ рднрд╛рдЧ , рджреВрд╕рд░рд╛ рднрд╛рдЧ ]



рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА



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



 [1;  2;  3]


рдиреЛрдЯ: рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдирд╣реАрдВред



[]



рдЕрд░реНрде рд╣реИ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреАред



рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╕рд┐рд░ (рдкрд╣рд▓рд╛ рддрддреНрд╡) рдФрд░ рдПрдХ рдкреВрдВрдЫ (рд╕рд┐рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЕрдиреНрдп рддрддреНрд╡) рд╣реИрдВред рд╕рд┐рд░ рдПрдХ рддрддреНрд╡ рд╣реИред рдкреВрдВрдЫ рдПрдХ рд╕реВрдЪреА рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд┐рд░ рдкреВрд░реНрдгрд╛рдВрдХ 1 рд╣реИ, рдФрд░ рдкреВрдВрдЫ рд╕реВрдЪреА [2; 3]



[2; 3]



ред



рд▓реЗрдЦрди рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╣реИ рдирд┐рд░реНрдорд╛рдг рдСрдкрд░реЗрдЯрд░ (рд╡рд┐рдкрдХреНрд╖) рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреЙрд░реНрдо head :: tail



ред рдиреАрдЪреЗ рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рдорддреБрд▓реНрдп рд╣реИрдВред



 [1;  2;  3]
 1 :: [2;  3]
 1 :: 2 :: [3]
 1 :: 2 :: 3 :: []


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



рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░



рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ int list



; рдкреНрд░рдХрд╛рд░ foo



рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ foo list



рд╣реЛрдЧреАред



рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╣рдо рдмрд╣реБрд░реВрдкрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'a list



) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ "рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рд╕реВрдЪреА" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред (рдзреНрдпрд╛рди рджреЗрдВ, 'a list



рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ 'a list



рдХреЗ рддрддреНрд╡ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЕрднреА рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЗ рдорд┐рд╢реНрд░рдг рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрди рдХрд╛ рдЕрд░реНрде рд╣реИ "рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рд▓реЗрдХрд┐рди рдПрдХред рдЙрд╕реА рдкреНрд░рдХрд╛рд░ ")ред



рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг List



рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд length



рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╕реВрдЪреА рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ, рдпрд╛ рддрд╛рд░, рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдЫреЛрдЯреЗ рдкреНрдпрд╛рд░реЗ рдЬрд╛рдирд╡рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, List.length



рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВред List.lenght



:



 List.length: 'рдПрдХ рд╕реВрдЪреА -> рдЗрдВрдЯ




рд╕рдВрд░рдЪрдирд╛



C рдФрд░ C ++ рдореЗрдВ struct



рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ (рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд)ред рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рд╕реА рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:



 рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝реА_рдСрдл_ рдЪрд┐рд╣реНрди {
   int a, b;
 };


OCaml рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдордХрдХреНрд╖ рдПрдХ рдЯреНрдпреВрдкрд▓ (рдЯреВрдкрд▓) рд╣реИ, рдЬреИрд╕реЗ (3,4)



, рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк int * int



ред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЯреБрдкрд▓реНрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, (3, "рд╣реЗрд▓реЛ", 'x') рдЯрд╛рдЗрдк int * string * char



ред



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



 рдкреНрд░рдХрд╛рд░ pair_of_ints = {a: int;  b: int} ;;


рдЙрдкрд░реЛрдХреНрдд рдкрдВрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдиреАрдЪреЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ :



 {a = 3;  b = 5}


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ ":" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп "="ред



рдпрд╣рд╛рдБ рдХреБрдЫ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ (toplevel):

 # рдЯрд╛рдЗрдк рдХрд░реЗрдВ pair_of_ints = {a: int;  b: int} ;;
 рдкреНрд░рдХрд╛рд░ pair_of_ints = {a: int;  рдмреА: рдЗрдВрдЯ;  }
 {{a = 3;  b = 5} ;;
 - - pair_of_ints = {a = 3;  b = 5}
 {{a = 3} ;;
 рдХреБрдЫ рд░рд┐рдХреЙрд░реНрдб рдлрд╝реАрд▓реНрдб рд▓реЗрдмрд▓ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ: рдмреА


OCaml рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫреЛрдбрд╝рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддрд╛ рд╣реИред



рд╡рд┐рдХрд▓реНрдк (рдпреЛрдЧреНрдп рд╕рдВрдШреЛрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг)



"рдпреЛрдЧреНрдп рдпреВрдирд┐рдпрди" рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рд╕реА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ gcc рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд░реНрдерди рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧреНрдп C рдХрд┐рддрдиреА рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



 рд╕рдВрд░рдЪрдирд╛ рдлреВ {
   int рдкреНрд░рдХрд╛рд░;
 #define TYPE_INT рез
 #define TYPE_PAIR_OF_INTS 2
 #define TYPE_STRING 3
   рд╕рдВрдШ {
     int i;  // рдпрджрд┐ рдЯрд╛рдЗрдк рдХрд░реЗрдВ == TYPE_INTред
     int рдЬреЛрдбрд╝реА [2];  // рдЕрдЧрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ == TYPE_PAIR_OF_INTSред
     рдЪрд╛рд░ * str;  // рдЕрдЧрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ == TYPE_STRING
   };
 };


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рд╕реБрдЦрдж рджреГрд╢реНрдп рдирд╣реАрдВ рд╣реИред рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ: рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрд╕ рд╕рдордп ui



рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕реНрд╡рд┐рдЪ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЧрдИ рд╣реИ)ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ type



рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ рднреВрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрдЧ рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдордЬрд╝реЗ рдФрд░ рдЧреЗрдо рд╣реЛрдВрдЧреЗред рд╣рд╛рдБ, рдФрд░ рдпрд╣ рд╕рдм рдмреЛрдЭрд┐рд▓ рд╣реИред



рдпрд╣рд╛рдБ OCaml рдкрд░ рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:



 type foo = рдХреБрдЫ рдирд╣реАрдВ |  рдЗрдВрдЯ рдХрд╛ рдЗрдВрдЯ |  рдЬреЛрдбрд╝реА рдХреА int * int |  рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ ;;


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



рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ of part



, рдЬрд╣рд╛рдВ type



рд╣рдореЗрд╢рд╛ рд▓реЛрдЕрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, Nothing



рдПрдХ рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдирд┐рд░реНрдорд╛рдгрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП , рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрд╛ рд╣реИ:



 рдХреБрдЫ рдирд╣реАрдВ
 рдЗрдВрдЯ рей
 рдЬреЛрдбрд╝реА (4, 5)
 рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ"
      рдФрд░ рд╕реАред


рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ foo



ред



рдиреЛрдЯ: of



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



рдЬрд╛рд░реА рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ



 enum рд╕рд╛рдЗрди {рд╕рдХрд╛рд░рд╛рддреНрдордХ, рд╢реВрдиреНрдп, рдирдХрд╛рд░рд╛рддреНрдордХ};


рдЗрд╕реЗ OCaml рдкрд░ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



 рдЯрд╛рдЗрдк рд╕рд╛рдЗрди = рд╕рдХрд╛рд░рд╛рддреНрдордХ |  рд╢реВрдиреНрдп |  рдирдХрд╛рд░рд╛рддреНрдордХ ;;




рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рдХрд▓реНрдк (рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП)



рд╡рд┐рдХрд▓реНрдк рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╣реБрдзрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реГрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:



 type Binary_tree = int рдХрд╛ рдкрддреНрддрд╛ |  рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА * рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА рдХрд╛ рдкреЗрдбрд╝ ;;




рдпрд╣рд╛рдБ рдХреБрдЫ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╣реИрдВред рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдХрд╛рдЧрдЬ рдкрд░ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:



 рдкрддреНрддреА рей
 рд╡реГрдХреНрд╖ (рдкрддреНрддреА 3, рдкрддреНрддреА 4)
 рдЯреНрд░реА (рдкреЗрдбрд╝ (рдкрддреНрддреА 3, рдкрддреНрддреА 4), рдкрддреНрддреА 5)
 рдЯреНрд░реА (рдЯреНрд░реА (рд▓реАрдл 3, рд▓реАрдл 4), рдЯреНрд░реА (рдЯреНрд░реА (рд▓реАрдл 3, рд▓реАрдл 4), рд▓реАрдл 5)




рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рдХрд▓реНрдк



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



 рдЯрд╛рдЗрдк рдХрд░реЗрдВ 'a Binary_tree = рд▓реАрдл рдСрдл' a |  рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА * рдХрд╛ рдкреЗрдбрд╝ рдПрдХ рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА ;;


рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╢реАрдЯ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ int binary_tree



рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рд╢реАрдЯ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ string binary_tree



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



 # рдкрддреНрддреА "рд╣реИрд▓реЛ" ;;
 - - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА = рд▓реАрдл "рд╣реЗрд▓реНрд▓реЛ"
 # рдкрддреНрддреА 3.0 ;;
 - - рдлреНрд▓реЛрдЯ рдмрд╛рдЗрдирд░реА_рдЯреНрд░реА = рд▓реАрдл 3ред




рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдирд╛рдо рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕реВрдЪреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int list



ред



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреЛрдИ рд╕рдВрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ рдХрд┐ a' list



рднреА рдЙрд╕реА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ" рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВред рд╕реВрдЪрд┐рдпрд╛рдБ рдЗрд╕ (рдереЛрдбрд╝реЗ рдЕрдЬреАрдм) рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:



  рдЯрд╛рдЗрдк 'рдП рд▓рд┐рд╕реНрдЯ = [] |  :: 'a *' рдПрдХ рд╕реВрдЪреА (* рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OCaml * рдХреЛрдб рдирд╣реАрдВ рд╣реИ)


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реНрдг рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:



 # рдЯрд╛рдЗрдк 'рдП рд▓рд┐рд╕реНрдЯ = рдирд┐рд▓ |  :: 'рдП *' рдХреА рдПрдХ рд╕реВрдЪреА ;;
 type 'a list = Nil |  :: 'a *' рдХреА рд╕реВрдЪреА
 # рдиреАрд▓ ;;
 -: 'рдПрдХ рд╕реВрдЪреА = рд╢реВрдиреНрдп
 # 1 :: рд╢реВрдиреНрдп ;;
 - - int рд╕реВрдЪреА = :: (1, рд╢реВрдиреНрдп)
 # 1 :: 2 :: рд╢реВрдиреНрдп ;;
 - - int рд╕реВрдЪреА = :: (1, :: (2, рдирд┐рд▓))


рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ - рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рд╛рдХреНрдпрдЧрдд рд╢рд░реНрдХрд░рд╛ [1; 2; 3]



[1; 2; 3]



[1; 2; 3]



, рдпрд╛ рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, 1 :: 2 :: 3 :: []



ред рдпрджрд┐ рд╣рдо рдКрдкрд░ a' list



рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВрдЧреЗред



рд╕реВрдЪреА, рд╕рдВрд░рдЪрдирд╛, рд╡рд┐рдХрд▓реНрдк - рдкрд░рд┐рдгрд╛рдо



OCaml рдореЗрдВ рдирд╛рдо рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕реВрдЪреА int рд╕реВрдЪреА [1; 2; 3]
рдЯрдкрд▓ int * рд╕реНрдЯреНрд░рд┐рдВрдЧ (3, "рд╣реИрд▓реЛ")
рдЕрднрд┐рд▓реЗрдЦ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реА = {a: int; b: string} {a = 3; b = "рд╣реИрд▓реЛ"}
рдкреНрд░рдХрд╛рд░ type foo = рдЗрдВрдЯ рдСрдлрд╝ рдЗрдВрдЯ

| рдЗрдВрдЯ * рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬреЛрдбрд╝реА
рдЗрдВрдЯ рей
рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рд╕рд╛рдЗрди = рд╕рдХрд╛рд░рд╛рддреНрдордХ | рд╢реВрдиреНрдп

| рдирдХрд╛рд░рд╛рддреНрдордХ
рд╕рдХрд╛рд░рд╛рддреНрдордХ

рд╢реВрдиреНрдп
рдкреИрд░рд╛рдорд┐рдЯреНрд░реАрдХреГрдд

рдкреНрд░рдХрд╛рд░
рдЯрд╛рдЗрдк рдХрд░реЗрдВ 'a__list = рдЦрд╛рд▓реА

| A a * тАЩрдХрд╛ my_list
рд╡рд┐рдкрдХреНрд╖ (1, рд╡рд┐рдкрдХреНрд╖ (2, рдЦрд╛рд▓реА))




рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди (рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП)



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



рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ: рдореИрдВ рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬреИрд╕реЗ n * (x + y) рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦрди рдЙрдкрдХрд░рдг рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдКрдкрд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ n * x + n * y рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧреБрдгрди рдХрд░рддрд╛ рд╣реВрдВред



рдЖрдЗрдП рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:



 expr = expr рдХрд╛ рдкреНрд▓рд╕ * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ a + b *)
           |  Expr рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ - b *)
           |  Expr рдХрд╛ рд╕рдордп * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ * b *)
	   |  Expr * expr рдХрд╛ рд╡рд┐рднрд╛рдЬрди (* рдХрд╛ рдЕрд░реНрде рд╣реИ a / b *)
           |  рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдореВрд▓реНрдп (* "x", "y", "n", рдЖрджрд┐ *)
	   ;;


рдкреНрд░рдкрддреНрд░ n * (x + y) рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:



 рдЯрд╛рдЗрдореНрд╕ (рдорд╛рди "n", рдкреНрд▓рд╕ (рдорд╛рди "x", рдорд╛рди "y"))




рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ (Value "n", Plus (Value "x", Value "y"))



n * (x+y)



рд╕рдорд╛рди рдХреБрдЫ рдФрд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЕрд▓рдЧрд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдореБрдЭреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред



 рдЖрдЗрдП rec_string рдИ = рдкрд░
   рдореИрдЪ рдИ рдХреЗ рд╕рд╛рде
     рдкреНрд▓рд╕ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> "(" ^ (to_string рдмрд╛рдПрдВ) ^ "+" ^ (in_string рджрд╛рдПрдВ) ^ ")"
   |  рдорд╛рдЗрдирд╕ (рдмрд╛рдПрдБ, рджрд╛рдПрдБ) -> "(" ^ (to_string рдмрд╛рдПрдБ) ^ "-" ^ (to_string рджрд╛рдПрдБ) ^ ")" "
   |  рдЯрд╛рдЗрдореНрд╕ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> "(" ^ (to_string рдмрд╛рдПрдВ) ^ "*" ^ (in_string рджрд╛рдПрдВ) ^ ")"
   |  рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> "(" ^ (to_string рдмрд╛рдПрдВ) ^ "/" ^ (to_string рджрд╛рдПрдВ) ^ ")"
   |  рдорд╛рди v -> v
   ;;

 рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛ Print_expr e =
   Print_endline (to_string e) ;;


(рдиреЛрдЯ: ^



рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд╛рд░реЛрдВ рдХреЛ рд╕рдорддрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)



рд▓реЗрдХрд┐рди рдХрд╛рдо рдореЗрдВ рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди:

 # Print_expr (рдЯрд╛рдЗрдореНрд╕ (рдорд╛рди "n", рдкреНрд▓рд╕ (рдореВрд▓реНрдп "x", рдореВрд▓реНрдп "y"))) ;;
 (n * (x + y))




рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк:

 рдХреЗ рд╕рд╛рде рдореИрдЪ рд╡рд╕реНрддреБ
   рдкреИрдЯрд░реНрди -> рдкрд░рд┐рдгрд╛рдо
 |  рдкреИрдЯрд░реНрди -> рдкрд░рд┐рдгрд╛рдо
     ...


рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╕рдВрд▓рдЧреНрдирдХ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ to_string



рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ), рдпрд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдлрд╛рд░реНрдо n * (x + y)



рдпрд╛ рдкреНрд░рдкрддреНрд░ (x + y) * n



рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдирдореВрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:



 recly_out рдХреЛ e = рдореЗрдВ рдкреБрди: рджрд░реНрдЬ рдХрд░реЗрдВ
   рдореИрдЪ рдИ рдХреЗ рд╕рд╛рде
     рдЯрд╛рдЗрдореНрд╕ (рдИ 1, рдкреНрд▓рд╕ (рдИ 2, рдИ 3)) ->
       рдкреНрд▓рд╕ (рдЯрд╛рдЗрдореНрд╕ (multiply_out e1, multiply_out e2),
             рдЯрд╛рдЗрдореНрд╕ (multiply_out e1, multiply_out e3))
   |  рдЯрд╛рдЗрдореНрд╕ (рдкреНрд▓рд╕ (рдИ 1, рдИ 2), рдИ 3) ->
       рдкреНрд▓рд╕ (рдЯрд╛рдЗрдореНрд╕ (multiply_out e1, multiply_out e3),)
             рдЯрд╛рдЗрдореНрд╕ (multiply_out e2, multiply_out e3))
   |  рдкреНрд▓рд╕ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> рдкреНрд▓рд╕ (рдмрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ, рдЧреБрдгрд╛ рдХрд░реЗрдВ)
   |  рдорд╛рдЗрдирд╕ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> рдорд╛рдЗрдирд╕ (рдмрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛), рджрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ (рджрд╛рдПрдВ рд╕реЗ)
   |  рдЯрд╛рдЗрдореНрд╕ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> рдЯрд╛рдЗрдореНрд╕ (рдмрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛), рджрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ (рджрд╛рдПрдВ рд╕реЗ)
   |  рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ) -> рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ (рдмрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ, рджрд╛рдПрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ)
   |  рдорд╛рди v -> рдорд╛рди v
   ;;


рдпрд╣рд╛рдБ рдпрд╣ рдХрд╛рдо рдореЗрдВ рд╣реИ:



 # Print_expr (multiply_out (рдЯрд╛рдЗрдореНрд╕ (рдорд╛рди "n"), рдкреНрд▓рд╕ (рдорд╛рди "x", рдореВрд▓реНрдп "y"))) ;;;
 ((n * x) + (n * y)


multiply_out



рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд╣рд▓реЗ рджреЛ рдирдореВрдиреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдирдореВрдирд╛ Time (e1, Plus (e2, e3))



, рдЬреЛ рдХрд┐ рдлреЙрд░реНрдо e1 * (e2 + e3)



рднрд╛рд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рддреБрд▓рдирд╛ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдордХрдХреНрд╖ (e1 * e2) + (e1 * e3)



ред



рджреВрд╕рд░рд╛ рдкреИрдЯрд░реНрди рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдлреЙрд░реНрдо рдХреЗ рднрд╛рд╡ (e1 + e2) * e3



рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣реИред



рд╢реЗрд╖ рдирдореВрдиреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡реЗ рдкреБрди: рдЕрд╡рдорд╛рдирдХ рд░реВрдк рд╕реЗ subexpressions рдкрд░ multiply_out



рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдмрдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрдИ рдЧреБрдирд╛ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рднреА рд╢реЗрд╖ рдкреИрдЯрд░реНрди рдХреЛ рд╕рд░рд▓ рдирд┐рдпрдо e -> e



) рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред



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



 рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛ =
   рдореИрдЪ рдИ рдХреЗ рд╕рд╛рде
     рдкреНрд▓рд╕ (рдЯрд╛рдЗрдореНрд╕ (e1, e2), рдЯрд╛рдЗрдореНрд╕ (e3, e4)) рдЬрдм e1 = e3 -> рдЯрд╛рдЗрдореНрд╕ (e1, рдкреНрд▓рд╕ (e2, e4))
   |  рдкреНрд▓рд╕ (рдЯрд╛рдЗрдореНрд╕ (рдИ 1, рдИ 2), рдЯрд╛рдЗрдореНрд╕ (рдИ 3, рдИ 4)) рдЬрдм рдИ 2 = рдИ 4 -> рдЯрд╛рдЗрдореНрд╕ (рдкреНрд▓рд╕ (рдИ 1, рдИ 3), рдИ 4)
   |  рдИ -> рдИ
   ;;




 # рдлреИрдХреНрдЯрд░рд╛рдЗрдЬрд╝ (рдкреНрд▓рд╕ (рдЯрд╛рдЗрдореНрд╕ (рдорд╛рди "рдПрди"), рд╡реИрд▓реНрдпреВ "рдПрдХреНрд╕"), рдЯрд╛рдЗрдореНрд╕ (рд╡реИрд▓реНрдпреВ "рдПрди", рд╡реИрд▓реНрдпреВ "рд╡рд╛рдИ"))) ;;
 - - expr = Times (рдорд╛рди "n", рдкреНрд▓рд╕ (рдорд╛рди "x", рдорд╛рди "y"))


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



рд╕реНрдерд┐рддрд┐ред



 рдХреЗ рд╕рд╛рде рдореИрдЪ рд╡рд╕реНрддреБ
   рдкреИрдЯрд░реНрди [рдЬрдм рд╣рд╛рд▓рдд] -> рдкрд░рд┐рдгрд╛рдо
   рдкреИрдЯрд░реНрди [рдЬрдм рд╣рд╛рд▓рдд] -> рдкрд░рд┐рдгрд╛рдо
     ...


рднрд╛рд╖рд╛ рдХреА рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ =



рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреАрдЪ "рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрддреНрд░рд╛рдЪрд╛рд░" рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реИред



OCaml рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ Product



рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрд╕рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ expr



рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:

 expr = expr рдХрд╛ рдкреНрд▓рд╕ * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ a + b *)
           |  Expr рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ - b *)
           |  Expr рдХрд╛ рд╕рдордп * expr (* рдХрд╛ рдЕрд░реНрде рд╣реИ * b *)
	   |  Expr * expr рдХрд╛ рд╡рд┐рднрд╛рдЬрди (* рдХрд╛ рдЕрд░реНрде рд╣реИ a / b *)
	   |  рдПрдХреНрд╕рдкреНрд░реЗ рд▓рд┐рд╕реНрдЯ рдХреЗ рдЙрддреНрдкрд╛рдж (* рдХрд╛ рдЕрд░реНрде рд╣реИ * рдмреА * рд╕реА * ... *)
           |  рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдореВрд▓реНрдп (* "x", "y", "n", рдЖрджрд┐ *)
	   ;;


рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ to_string рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред OCaml рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА:

 рдЪреЗрддрд╛рд╡рдиреА: рдпрд╣ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
 рдпрд╣рд╛рдВ рдПрдХ рдРрд╕реЗ рдореВрд▓реНрдп рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ:
 рдЙрддреНрдкрд╛рдж _



All Articles