[рд▓рдЧрднрдЧред рдкреНрд░рддрд┐: рдЕрдиреБрд╡рд╛рдж рдЬрд╛рд░реА рд░рдЦрд╛ред
рдкрд╣рд▓рд╛ рднрд╛рдЧ ,
рджреВрд╕рд░рд╛ рднрд╛рдЧ ]
рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА
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 рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА:
рдЪреЗрддрд╛рд╡рдиреА: рдпрд╣ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдВ рдПрдХ рдРрд╕реЗ рдореВрд▓реНрдп рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ:
рдЙрддреНрдкрд╛рдж _