
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХрдард┐рди рдкрд░рд┐рдЪрдп рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧред рджреВрд╕рд░рд╛ рднрд╛рдЧ
рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИредtl; dr : рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдпред
рдпреБрдкреАрдбреАред рдпрджрд┐ рдЖрдкрдХреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ, рддреЛ
рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЫреЛрдбрд╝реЗрдВред рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╕рдиреНрди рд╣реЛрдЧрд╛;)
рдореЗрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╕реБрдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓-рдирд┐рдВрдЬрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╕ рдЙрди рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдЖрдкрдХреА рдЪреЗрддрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рднрд╛рд╖рд╛рдПрдБ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ
- рдЪрд░
- рдЪрдХреНрд░
- рд╕рдВрдХреЗрдд (рднрд▓реЗ рд╣реА рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдБ рдЗрд╕ рддрдереНрдп рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рддрдереНрдп рд╣реИ)
- рд╕рдВрд░рдЪрдирд╛рдПрдВ, рд╡рд╕реНрддреБрдПрдВ рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ (рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ)
рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрдирд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдЙрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдЖрдкрдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдЕрдзреНрдпрдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рдХрдореА рдереАред
рдпрд╣ рд▓реЗрдЦ рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╕рдбрд╝рдХ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддреА рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рджреЛ рдХрд┐рддрд╛рдмреЗрдВ рдкрдврд╝рдирд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
"рдЖрдк рдПрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦреЗрдВ" , рдФрд░ рдлрд┐рд░
"рд░рд┐рдпрд▓ рд╡рд░реНрд▓реНрдб рд╣рд╛рд╕реНрдХреЗрд▓" ред
рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рдкреБрд╕реНрддрдХреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред
рджреВрд╕рд░реА рдУрд░, рдпрд╣ рд▓реЗрдЦ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЬреЛ рд╣рд╕реНрдХреЗрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдпрд╛рдж рдЖ рд░рд╣реА рдереАрдВред
рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдБрдЪ рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдкрд░рд┐рдЪрдп: рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдирд┐рдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ: рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛рдПрдВред
- рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛:
- рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА; рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╕реЗ рдЙрджрд╛рд╣рд░рдг
- рдкреНрд░рдХрд╛рд░; рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рдирдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдЙрджрд╛рд╣рд░рдг
- рдЕрдВрддрд╣реАрди рд╕рдВрд░рдЪрдирд╛рдПрдВ; рдПрдХ рдЕрдВрддрд╣реАрди рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ!
- рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛:
- рд╣рдо IO рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ; рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг
- рдЖрдИрдУ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд╛рд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг; рдЕрд╡рд┐рд╡реЗрдХреА рддрд┐рдкрд╣рд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ
- рдЗрдХрд╛рдИ; рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЕрдореВрд░реНрдд рдЙрдкрдХрд░рдг
- рдкрд░рд┐рд╢рд┐рд╖реНрдЯ:
- рдЕрдВрддрд╣реАрди рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╢рдмреНрдж; рдЕрдирдВрдд рдкреЗрдбрд╝реЛрдВ рдХреА рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдЙрдиреНрдореБрдЦ рдЪрд░реНрдЪрд╛
рдиреЛрдЯ: рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ .lhs
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рджреЗрдЦрддреЗ рд╣реИрдВ,
рдЖрдк рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ filename.lhs
рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рддреЛ, рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ
runhaskell рдлрд╝рд╛рдЗрд▓ рдирд╛рдоред lhs
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдиреАрдЪреЗ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
01_basic / 10_Introduction / 00_hello_world.lhsрдкрд░рд┐рдЪрдп
рд╕реНрдерд╛рдкрдирд╛

рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ:
ghc
: C
рд▓рд┐рдП gcc рдХреЗ рд╕рдорд╛рди рдПрдХ рд╕рдВрдХрд▓рдХ C
ghci
: рд╣рд╛рд╕реНрдХреЗрд▓ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рд╢реЗрд▓ (REPL)runhaskell
: рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВред рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗред
рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ

рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рдФрд░ рд▓реЗрдЦ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧреВрдврд╝ рд╕реВрддреНрд░реЛрдВ (рддреНрд╡рд░рд┐рдд рдкреНрд░рдХрд╛рд░, рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рддреБрд░рдВрдд рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдорд╣рд╛рд╢рдХреНрддрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдореИрдВ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдирдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдкрд░рд┐рдЪрд┐рдд тАЬрд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдбтАЭ рд╕реЗред
main = putStrLn "Hello World!"
рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдХреЛ
hello.hs
рдХреЗ рд░реВрдк рдореЗрдВ
hello.hs
рдФрд░ рдЪрд▓рд╛рдПрдБ:
~ runhaskell ./hello.hs Hello World!
рдЖрдк "рдкрд░рд┐рдЪрдп" рдХреЗ рддрд╣рдд рд╕реНрдерд┐рдд рд▓рд┐рдВрдХ рд╕реЗ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ
00_hello_world.lhs
рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
~ runhaskell 00_hello_world.lhs Hello World!
01_basic / 10_Introduction / 00_hello_world.lhs
01_basic / 10_Introduction / 10_hello_you.lhsрдФрд░ рдЕрдм рд╣рдо рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХрд╛ рдирд╛рдо рдкреВрдЫреЗрдЧрд╛ рдФрд░ рдХрд╣реЗрдЧрд╛ "рд╣реИрд▓реЛ, рдирд╛рдо!"
main = do print " ?" name <- getLine print (" " ++ name ++ "!")
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
// In C #include <stdio.h> int main (int argc, char **argv) { char name[666]; // <- ! // , 665 ? printf(" ?\n"); scanf("%s", name); printf(" %s!\n", name); return 0; }
рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЕрдВрддрд░ рд╣реИрдВред рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
main
рдХрд╛рд░реНрдп рдХрд╛ рдкреНрд░рдХрд╛рд░
IO ()
ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
main
рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИред
01_basic / 10_Introduction / 10_hello_you.lhs
01_basic / 10_Introduction / 20_very_basic.lhsрд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╣рд╛рд╕реНрдХреЗрд▓

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрдИ рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдиреА рд╣реЛрдВрдЧреАред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдЖрдкрдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдмреЗрд╣рддрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдЙрдиреНрдирдд рд╕реНрдереИрддрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧC
,
C++
рдпрд╛
Java
рдореЗрдВ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЦрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред
рдкрд╡рд┐рддреНрд░рддрд╛рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
рдПрдХ рддрд░рдл, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдПрдХ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░реЙрдХреЗрдЯ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдУрд░, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЖрд╕рд╛рди рд╕рдорд╛рдирд╛рдВрддрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд╛рдл рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рдмреБрдирд┐рдпрд╛рджреА рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рдиреВрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
рдврд┐рд▓рд╛рдИрдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрд▓рд╕реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗрд╡рд▓ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдирддреАрдЬрддрди, рд╣рдо рдЕрдирдВрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред
рдЖрдЦрд┐рд░реА рдЪреЗрддрд╛рд╡рдиреА рдЪрд┐рдВрддрд╛ рдХрд░реЗрдЧреА рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдХреИрд╕реЗ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреА рддрд░рд╣ рд╣реИред
рдХреБрдЫ рднрд╛рдЧ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реВрддреНрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдкрдврд╝реЗрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрддреЗ рд╕рдордп, рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рддреЛ рдпрд╣
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдк
>>=
,
<$>
,
<-
рдпрд╛ рдЕрдиреНрдп рдбрд░рд╛рд╡рдиреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдХрд╛рд░реНрдп рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
рдЖрдк рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
C
:
int f(int x, int y) { return x*x + y*y; }
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ:
function f(x,y) { return x*x + y*y; }
рдкрд╛рдпрдерди рдореЗрдВ:
def f(x,y): return x*x + y*y
рд░реВрдмреА рдкрд░:
def f(x,y) x*x + y*y end
рдпреЛрдЬрдирд╛ рдкрд░:
(define (fxy) (+ (* xx) (* yy)))
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓:
fxy = x*x + y*y
рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреЛрдИ рдХреЛрд╖реНрдардХ рдирд╣реАрдВ, рдХреЛрдИ
def
рдирд╣реАрдВред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИред
рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВред
~ runhaskell 20_very_basic.lhs 13
01_basic / 10_Introduction / 20_very_basic.lhs
01_basic / 10_Introduction / 21_very_basic.lhsрдЕрдм рдХреЛрд╢рд┐рд╢ рдХрд░реЛ
f :: Int -> Int -> Int fxy = x*x + y*y main = print (f 2.3 4.2)
рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
21_very_basic.lhs:6:23: No instance for (Fractional Int) arising from the literal `4.2' Possible fix: add an instance declaration for (Fractional Int) In the second argument of `f', namely `4.2' In the first argument of `print', namely `(f 2.3 4.2)' In the expression: print (f 2.3 4.2)
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐
4.2
рдЗрдВрдЯ рдирд╣реАрдВ рд╣реИред
01_basic / 10_Introduction / 21_very_basic.lhs
01_basic / 10_Introduction / 22_very_basic.lhsрдПрдХ рд╕рдорд╛рдзрд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рддрдм рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрдЯреМрддреА рдХрд░реЗрдЧрд╛:
fxy = x*x + y*y main = print (f 2.3 4.2)
рдЬреАрдд рдЧрдП рд╣реИрдВ!
рдорд╣рд╛рди, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
C
, рдЖрдкрдХреЛ
int
рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА,
float
,
long
,
double
, рдЖрджрд┐ред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рд╕реНрдХреЗрд▓ рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдЯреМрддреА рдХреА рд╣реИ, рдмрд╕ ghci рдЪрд▓рд╛рдПрдВ:
% ghci GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude> let fxy = x*x + y*y Prelude> :type f f :: Num a => a -> a -> a
рд╣рдореНрдо ... рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдЬреАрдм рд╣реИ?
Num a => a -> a -> a
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ
a -> a -> a
рдХреЗ рджрд╛рдИрдВ рдУрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ | рдореВрд▓реНрдп |
Int | Int рд▓рд┐рдЦреЗрдВ |
Int -> Int | рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрдирдкреБрдЯ Int рд▓реЗрддрд╛ рд╣реИ рдФрд░ Int рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ |
Float -> Int | рдлрд╝рдВрдХреНрд╢рди рдЬреЛ Float рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ Int рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ |
a -> Int | рдлрдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ Int рджреЗрддрд╛ рд╣реИ |
a -> a | рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ a рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ a |
a -> a -> a | рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ a рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХреЗ рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ a |
A
a -> a -> a
, рдЕрдХреНрд╖рд░
a
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рд╣реИ ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐
f
рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рддрд░реНрдХ, рд╕рд╛рде рд╣реА рдкрд░рд┐рдгрд╛рдо, рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
Int
,
Integer
,
Float
...
рдЗрд╕рд▓рд┐рдП рд╣рд╛рд░реНрдб рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рдЬреИрд╕реЗ рдХрд┐
C
рдФрд░ рдЕрд▓рдЧ рд╕реЗ
int
,
long
,
float
,
double
, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ ...
рд╣рдо рдмрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдореЗрдВред
рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
String
,
Int
, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ
Trees
, рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░, рдЖрджрд┐ рдХреЗ рд╕рд╛рдеред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ
Num a =>
ред
Num
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ ред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Num
рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рд╕рдЦреНрддреА рд╕реЗ,
Num
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
(+)
рдФрд░
(*)
рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рджрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдПрдВ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрддреНрд╡ рд╣реИрдВред
рдЙрдирдХреА рдорджрдж рд╕реЗ рд╣рдо рдХрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдЕрддрдГ,
Num a => a -> a -> a
рдорддрд▓рдм рд▓рд┐рдЦрдирд╛
рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛
a
рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд
a
рдкреНрд░рдХрд╛рд░ рд╣реИред
рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди (
a -> a
)ред
рд╣рдореНрдо, рдпрд╣ рдЕрдЬреАрдм рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рд╣реИред
рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред
ред
рдЕрд░реНрдерд╛рдд,
f 3 4
(f 3) 4
рдмрд░рд╛рдмрд░ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
f 3
рднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
f :: Num a :: a -> a -> a g :: Num a :: a -> a g = f 3 gy тЗФ 3*3 + y*y
рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЖрдкрдХреЛ рдирд╛рдордХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
g = \y -> 3*3 + y*y
\
рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣
╬╗
рдЪрд░рд┐рддреНрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпрд╣ рдПрдХ ASCII рд╡рд░реНрдг рд╣реИред
рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЙрдмрд╛рд▓ рдЖрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
01_basic / 10_Introduction / 22_very_basic.lhs
01_basic / 10_Introduction / 23_very_basic.lhsрд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ:
f :: Num a => a -> a -> a fxy = x*x + y*y main = print (f 3 2.4)
рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
3
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрдерд╛рдпреА (рдЖрдВрд╢рд┐рдХ) рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдлреНрд▓реЛрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХред
рдЪреВрдБрдХрд┐
2.4
рднрд┐рдиреНрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
3
рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк
3
рднреА рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
01_basic / 10_Introduction / 23_very_basic.lhs
01_basic / 10_Introduction / 24_very_basic.lhsрдпрджрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛:
f :: Num a => a -> a -> a fxy = x*x + y*y x :: Int x = 3 y :: Float y = 2.4 main = print (fxy)
рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред
рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдФрд░ рдордЬреЗрджрд╛рд░ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
WAT01_basic / 10_Introduction / 24_very_basic.lhsрд╣рд╛рд╕реНрдХреЗрд▓ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ

рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдЦрдВрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдХрд┐рдо рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рднрд╛рд╖рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрдЬреАрдм рдпрд╛ рдЕрд╕рдВрдЧрдд рд▓рдЧрдиреЗ рдкрд░ рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВред
рдореИрдВ рджреЛ рднрд╛рд╡реЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХ
тЗФ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рдПрдХ рдореЗрдЯрд╛-рд╕рдВрдХреЗрддрди рд╣реИ; рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХ
тЗТ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рднрд╛рд╡
рдЕрдВрдХрдЧрдгрд┐рдд
3 + 2 * 6 / 3 тЗФ 3 + ((2*6)/3)
рдкрд╣реЗрд▓реА
True || False тЗТ True True && False тЗТ False True == False тЗТ False True /= False тЗТ True (/=)
рдкреЗрдЪреАрджрдЧреА
x^n n (Int Integer) x**y y ( Float)
рдорд╢реАрди рдХреА рд░реИрдо рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде
Integer
рдХреА рдХреЛрдИ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ:
4^103 102844034832575377634685573909834406561420991602098741459288064
рдЕрд░реЗ рд╣рд╛рдБ!
рдФрд░ рдЖрдк рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ
Data.Ratio
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
Data.Ratio
:
$ ghci .... Prelude> :m Data.Ratio Data.Ratio> (11 % 15) * (5 % 3) 11 % 9
рд╕реВрдЪрд┐рдпреЛрдВ
[] тЗФ [1,2,3] тЗФ ["foo","bar","baz"] тЗФ (String) 1:[2,3] тЗФ [1,2,3], (:) 1:2:[] тЗФ [1,2] [1,2] ++ [3,4] тЗФ [1,2,3,4], (++) [1,2,3] ++ ["foo"] тЗФ String тЙа Integral [1..4] тЗФ [1,2,3,4] [1,3..10] тЗФ [1,3,5,7,9] [2,3,5,7,11..100] тЗФ ! ! [10,9..1] тЗФ [10,9,8,7,6,5,4,3,2,1]
рдкрдВрдХреНрддрд┐рдпрд╛рдВ
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рддрд╛рд░
Char
рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред
'a' :: Char "a" :: [Char] "" тЗФ [] "ab" тЗФ ['a','b'] тЗФ 'a':"b" тЗФ 'a':['b'] тЗФ 'a':'b':[] "abc" тЗФ "ab"++"c"
рдиреЛрдЯ :
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдЖрдк рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП Data.Text
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ ASCII рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ Data.ByteString
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
tuples
рдЖрдк рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
(a,b)
ред
рдПрдХ рдЯрдкрд▓ рдХреЗ рддрддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХреЛрд╖реНрдардХ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ
рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
($)
рдФрд░
(.)
ред
01_basic / 20_Essential_Haskell / 10a_Functions.lhsрдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ
рдереЛрдбрд╝рд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ:
x :: Int тЗФ x Int x :: a тЗФ x x :: Num a => a тЗФ x a, Num f :: a -> b тЗФ f a b f :: a -> b -> c тЗФ f , a (bтЖТc) f :: (a -> b) -> c тЗФ f , (aтЖТb) c
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдЦреБрдж рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ред
рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрдВрдЧреВрдареЗ рдХрд╛ рдПрдХ рдирд┐рдпрдо рд╣реИред
Infix рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ square :: Num a => a -> a square x = x^2
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
^
рдЙрдкрдпреЛрдЧ рдЗрдиреНрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП, рдЙрдкрд╕рд░реНрдЧ рд▓реЗрдЦрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдмрд╕ рдЗрдЪреНрдЫрд┐рдд рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред
square' x = (^) x 2 square'' x = (^2) x
рд╣рдо
x
рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ!
рдЗрд╕реЗ ╬╖-рдХрдореА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
square''' = (^2)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо
'
рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдореЗрдВ рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
square
тЗФ square'
square''
square '''
рдкрд░реАрдХреНрд╖рдг absolute :: (Ord a, Num a) => a -> a absolute x = if x >= 0 then x else -x
рдиреЛрдЯ:
if .. then .. else
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ
if .. then .. else
рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реИ
┬д?┬д:┬д
рд╕реА рдореЗрдВред рдЖрдк
else
рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗред
рдПрдХ рдФрд░ рд╕рдорд╛рд░реЛрд╣ рд╕рдордХрдХреНрд╖:
absolute' x | x >= 0 = x | otherwise = -x
рдиреЛрдЯ: рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЕрдЬрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдорд┐рд╕рд▓рд┐рдЧреНрдиреНрдореЗрдВрдЯ рдХреЛрдб рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ!
рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛
рд╣рдо рдЬрдЯрд┐рд▓ рднрд╛рдЧ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╢реИрд▓реА

рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдЕрджреНрднреБрдд рдХреЛрдб рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╕рдордЭрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╣рд▓ рдХрд░реЗрдВрдЧреЗ:
рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рд╕реВрдЪреА рдореЗрдВ рд╕рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг:
[1,2,3,4,5] тЗТ 2 + 4 тЗТ 6
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ):
function evenSum(list) { var result = 0; for (var i=0; i< list.length ; i++) { if (list[i] % 2 ==0) { result += list[i]; } } return result; }
рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреЛрдИ рдЪрд░ рдФрд░ рдЫреЛрд░ рдирд╣реАрдВ рд╣реИрдВред
рдЫреЛрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдиреЛрдЯ :
рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдзреАрдореА рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╖реНрдард╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдмрд╣реБрдд рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ
C
рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ
C
рд╕рд░рд▓ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред
int evenSum(int *list) { return accumSum(0,list); } int accumSum(int n, int *list) { int x; int *xs; if (*list == 0) {
рдЗрд╕ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рддреАрди рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
even :: Integral a => a -> Bool head :: [a] -> a tail :: [a] -> [a]
рд╕рдорддрд╛ рдЬрд╛рдБрдЪред
even :: Integral a => a -> Bool even 3 тЗТ False even 2 тЗТ True
head
рдиреЗ рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реМрдЯрд╛рдпрд╛:
head :: [a] -> a head [1,2,3] тЗТ 1 head [] тЗТ ERROR
tail
рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓реМрдЯрд╛рддреА рд╣реИ:
tail :: [a] -> [a] tail [1,2,3] тЗТ [2,3] tail [3] тЗТ [] tail [] тЗТ ERROR
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рдЧреИрд░-рд░рд┐рдХреНрдд рд╕реВрдЪреА
l
,
l тЗФ (head l):(tail l)
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 11_Functions.lhsрддреЛ, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рдиред
evenSum
рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рд╕рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
ghci
рдЪрд▓рд╛рдПрдВ:
% ghci GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> :load 11_Functions.lhs [1 of 1] Compiling Main ( 11_Functions.lhs, interpreted ) Ok, modules loaded: Main. *Main> evenSum [1..5] 6
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдмрд╛рдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдзреЛрдЦрд╛ рджреЗ рд░рд╣рд╛ рд╣реВрдВред рдкрддрд╛ рд╣реИред рд╣рдо рдмрд╛рдж рдореЗрдВ рдвреАрд▓реЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╡рд╛рд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ):
*Main> evenSum [1..5] accumSum 0 [1,2,3,4,5] 1 is odd accumSum 0 [2,3,4,5] 2 is even accumSum (0+2) [3,4,5] 3 is odd accumSum (0+2) [4,5] 4 is even accumSum (0+2+4) [5] 5 is odd accumSum (0+2+4) [] l == [] 0+2+4 0+6 6
рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдмрд╣реБрдд рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
evenSum :: Integral a => [a] -> a
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 11_Functions.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 12_Functions.lhsрдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ
where
рдпрд╛
let
рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛
accumSum
рдХрд╛рд░реНрдп рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдирд╣реАрдВ
accumSum
ред
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 12_Functions.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 13_Functions.lhsрдЕрдм рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдХреЗрд╡рд▓ рдирд╛рдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред (рд╕рдмрд╕реЗ рд╕рд╛рд╣рд╕реА рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг
рдпрд╣рд╛рдВ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ )
рдЗрд╕ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп:
foo l = if l == [] then <x> else <y>
рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
foo [] = <x> foo l = <y>
рд▓реЗрдХрд┐рди рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреА рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
foo l = let x = head l xs = tail l in if even x then foo (n+x) xs else foo n xs
рдкрд░
foo (x:xs) = if even x then foo (n+x) xs else foo n xs
рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ред
рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 13_Functions.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 14_Functions.lhsрдЖрдк ell-рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓реЗрдЦрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп:
fx = (- ) x
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
f = -
рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ
l
рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 14_Functions.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 15_Functions.lhsрдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо FEP (рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдЬрд╛рдирд╡рд░ рд╣реИрдВ?
рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
filter :: (a -> Bool) -> [a] -> [a] map :: (a -> b) -> [a] -> [b] foldl :: (a -> b -> a) -> a -> [b] -> a
рд╣рдо рдЫреЛрдЯреЗ рдХрджрдореЛрдВ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
рдЬрд╣рд╛рдБ
filter even [1..10] тЗФ [2,4,6,8,10]
filter
рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ (
a -> Bool
) рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА
[a]
рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди
true
рд▓реМрдЯрд╛ред
рд╣рдорд╛рд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рдЪрдХреНрд░ рдХреЛ рдФрд░ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо
foldl
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдЬрдорд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
foldl
рд╕рдорд╛рд░реЛрд╣ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддрдХрдиреАрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
myfunc list = foo initialValue list foo accumulated [] = accumulated foo tmpValue (x:xs) = foo (bar tmpValue x) xs
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдирд┐рдореНрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
myfunc list = foldl bar initialValue list
рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рджреВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ,
foldl
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
foldl fz [] = z foldl fz (x:xs) = foldl f (fzx) xs
foldl fz [x1,...xn] тЗФ f (... (f (fz x1) x2) ...) xn
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдЖрд▓рд╕реА рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рди
(fzx)
рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдЯреИрдХ
(fzx)
рдзрдХреЗрд▓ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо
foldl'
рдЬрдЧрд╣
foldl'
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ;
foldl'
рдХрд╛ рдПрдХ
рд╕рдЦреНрдд (рдпрд╛ рдКрд░реНрдЬрд╛рд╡рд╛рди) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдпрджрд┐ рдЖрд▓рд╕реА рдФрд░ рд╕рдЦреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдмрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рджреЛрдиреЛрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рд╣реИрдВред
рдЕрдм
evenSum
рдХрд╛ рд╣рдорд╛рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЕрд╕реНрдерд╛рдпреА
mysum
рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛
mysum
ред
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (\xy -> x+y) тЗФ (+)
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 15_Functions.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 16_Functions.lhsрдЕрдВрдд рдореЗрдВ
foldl'
рд╕рдмрд╕реЗ рд╕рд╣рдЬ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХрджрдо-рджрд░-рдЪрд░рдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ: evenSum [1,2,3,4] тЗТ foldl' (+) 0 (filter even [1,2,3,4]) тЗТ foldl' (+) 0 [2,4] тЗТ foldl' (+) (0+2) [4] тЗТ foldl' (+) 2 [4] тЗТ foldl' (+) (2+4) [] тЗТ foldl' (+) 6 [] тЗТ 6
рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рд╣реИ (.)
редрдлрд╝рдВрдХреНрд╢рди (.)
рдЧрдгрд┐рддреАрдп рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред (f . g . h) x тЗФ f ( g (hx))
рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдФрд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЛрдб рдХреНрд▓реАрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреБрдЫ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдо рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВредрдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛?рдХреЛрдб рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдкреНрд▓рд╕ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рд╕рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рдПред [1,2,3,4] тЦ╖ [1,4,9,16] тЦ╖ [4,16] тЦ╖ 20
рд╕рдВрд╕реНрдХрд░рдг 10 рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: squareEvenSum = sum' . (filter even) . (map (^2)) squareEvenSum' = evenSum . (map (^2)) squareEvenSum'' = sum' . (map (^2)) . (filter even)
рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ "рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рди" рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ squareEvenSum''
рдЕрдиреНрдп рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред рдСрд░реНрдбрд░ (.)
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред) map (^2) [1,2,3,4] тЗФ [1,4,9,16]
рдлрд╝рдВрдХреНрд╢рди map
рдХреЗрд╡рд▓ рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИредрд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ редрдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЙрдбреНрдпреВрд▓рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ "рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░" рдХрд░рдиреЗ рд▓рдЧреАредрдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЖрдк рдЕрдкрдиреЗ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд░рдЪрдирд╛, рдорд╛рдирдЪрд┐рддреНрд░, рдореЛрдбрд╝ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрд╣рдо рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗредрдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рдЧрд▓рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреИрд╕реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдпрд╣ рдордЬреЗрджрд╛рд░ рд▓реЗрдЦ рдкрдврд╝реЗрдВ:Meijer, Fokkinga рдФрд░ Paterson рджреНрд╡рд╛рд░рд╛ рдХреЗрд▓реЗ, рд▓реЗрдВрд╕, рд▓рд┐рдлрд╛рдлреЗ рдФрд░ рдХрд╛рдВрдЯреЗрджрд╛рд░ рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ редрд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдБ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИредрд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбреАрдПрд╕рдПрд▓рдПрд╕ (рдбреЛрдореЗрди-рдУрд░рд┐рдПрдВрдЯреЗрдб рд▓реИрдВрдЧреНрд╡реЗрдЬ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИредрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдореИрдВрдиреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдпреЛрджреНрдШрд╛рдЯрди рдерд╛редрд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдорд╣рд╛рд╢рдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдХрдо рдХрд░ рджреЗрдВ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ - рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ редрдкреНрд░рдХрд╛рд░

tl; рдбреЙрдЖрд░ :
type Name = AnotherType
рдпрд╣ рдмрд╕ рд╕рдВрдХрд▓рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ Name
рдФрд░ AnotherType
рдПрдХ рд╣реА рд▓рдЧ рд░рд╣реА рд╣реИредdata Name = NameConstructor AnotherType
рдФрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реИрдВредdata
рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдВрд░рдЪрдирд╛рдПрдБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВредderiving
рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЬрд╛рджреВ рдЯреЛрдирд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдордЬрдмреВрдд рд╕реНрдЯреЗрдЯрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИредрдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИредрд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░ рд╕рдВрдХрд▓рди рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдпрджрд┐ рдЖрдк рдЧрд▓рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЧрд▓рдд рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдЧрд╛редрдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди
рдлрд╛рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдЯрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИредрд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдХрдордЬреЛрд░ рд╣реЛрддреА рд╣реИрдВредрд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдЧрдВрднреАрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ редрдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдгредрд╕рдорд╛рд░реЛрд╣ square
рднрд╛рд╖рд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ: square x = x * x
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди square
рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреНрдпреВрдорд░рд▓ рдХреЛ (рд╡рд░реНрдЧ) рдХрд░ рд╕рдХрддрд╛ рд╣реИ редрдЖрдк рдПрдХ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Int
, Integer
, Float
, Fractional
рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ Complex
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
% ghci GHCi, version 7.0.4: ... Prelude> let square x = x*x Prelude> square 2 4 Prelude> square 2.1 4.41 Prelude>
x :+ y
рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ ( x + iy ) рдХрд╛ рдЕрдВрдХрди рд╣реИ редрдЕрдм C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: int int_square(int x) { return x*x; } float float_square(float x) {return x*x; } complex complex_square (complex z) { complex tmp; tmp.real = z.real * z.real - z.img * z.img; tmp.img = 2 * z.img * z.real; } complex x,y; y = complex_square(x);
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдХреЗрд╡рд▓ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: #include <iostream> #include <complex> using namespace std; template<typename T> T square(T x) { return x*x; } int main() { // int int sqr_of_five = square(5); cout << sqr_of_five << endl; // double cout << (double)square(5.3) << endl; // complex cout << square( complex<double>(5,3) ) << endl; return 0; }
рд╕реА ++ рд╕рдВрд╕реНрдХрд░рдг рд╕реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдПрдХ рдЬрдЯрд┐рд▓ рдЪрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредред
C ++ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИредрд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рд╡рд┐рдкрд░реАрдд рд╣реИредрдлрд╝рдВрдХреНрд╢рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреА рднрд╛рд╡рдирд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрдХрдбрд╝ рд▓реА рдЬрд╛рддреА рд╣реИрдВредрд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:"рдЕрдЧрд░ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ"
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 21_Types.lhsрдирдП рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛
рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯрд╛рдЗрдк рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред type Name = String type Color = String showInfos :: Name -> Color -> String showInfos name color = "Name: " ++ name ++ ", Color: " ++ color name :: Name name = "Robin" color :: Color color = "Blue" main = putStrLn $ showInfos name color
рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдмрдЪрд╛рддрд╛ рд╣реИредрдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ showInfos
рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ : putStrLn $ showInfos color name
рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдПрдЧрд╛ред рдЖрдк рд╡рд┐рдирд┐рдореЗрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо, рд░рдВрдЧ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВредрдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ data
ред data Name = NameConstr String data Color = ColorConstr String showInfos :: Name -> Color -> String showInfos (NameConstr name) (ColorConstr color) = "Name: " ++ name ++ ", Color: " ++ color name = NameConstr "Robin" color = ColorConstr "Blue" main = putStrLn $ showInfos name color
рдпрджрд┐ рдЖрдк showInfos
рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡реИрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рдкрде рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреАрдордд рдкрд░редрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛рд░реНрдп рд╣реИрдВ: NameConstr :: String -> Name ColorConstr :: String -> Color
рдЙрдкрдпреЛрдЧ data
рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: data TypeName = ConstructorName [types] | ConstructorName2 [types] | ...
рдХреЗ рд▓рд┐рдПDataTypeName рдФрд░ DataTypeConstructor рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╣реА рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
data Complex = Num a => Complex aa
рдЖрдк рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: data DataTypeName = DataConstructor { field1 :: [type of field1] , field2 :: [type of field2] ... , fieldn :: [type of fieldn] }
рдФрд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдирдП рдореВрд▓реНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЦреЗрддреЛрдВ рдХреЗ рдПрдХ рдордирдорд╛рдиреЗ рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдПрдХ рдЙрджрд╛рд╣рд░рдг:
data Complex = Num a => Complex { real :: a, img :: a} c = Complex 1.0 2.0 z = Complex { real = 3, img = 4 } real c тЗТ 1.0 img z тЗТ 4
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 22_Types.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 23_Types.lhsрдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░
рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рдорд┐рд▓ рдЪреБрдХреЗ рд╣реИрдВ - рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред рдЖрдк рдПрдХ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: data List a = Empty | Cons a (List a)
рдПрдХ рдЖрд╕рд╛рди рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ infix рдкреНрд░рдХрд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред infixr 5 ::: data List a = Nil | a ::: (List a)
рдЗрд╕рдХреЗ рдмрд╛рдж infixr
рдХрд╛ рдирдВрдмрд░ рдСрдкрд░реЗрдЯрд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИредрдпрджрд┐ рдЖрдк рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( Show
), рдкрдврд╝реЗрдВ ( Read
), рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ ( Eq
) рдФрд░ Ord
рдЕрдкрдиреЗ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ ( ), рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред infixr 5 ::: data List a = Nil | a ::: (List a) deriving (Show,Read,Eq,Ord)
рдЬрдм рдЖрдк deriving (Show)
рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ , рддреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ show
ред рдЬрд▓реНрдж рд╣реА рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ show
ред convertList [] = Nil convertList (x:xs) = x ::: convertList xs
main = do print (0 ::: 1 ::: Nil) print (convertList [0,1])
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ: 0 ::: (1 ::: Nil) 0 ::: (1 ::: Nil)
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 23_Types.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 30_Trees.lhsрдкреЗрдбрд╝
рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝ред import Data.List data BinTree a = Empty | Node a (BinTree a) (BinTree a) deriving (Show)
рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдПрдХ рд╕реВрдЪреА рдХреЛ рдПрдХ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред treeFromList :: (Ord a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x (treeFromList (filter (<x) xs)) (treeFromList (filter (>x) xs))
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВредрд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж:- рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдПрдХ рдЦрд╛рд▓реА рдкреЗрдбрд╝ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред
- рд╕реВрдЪреА рдореЗрдВ
(x:xs)
рдПрдХ рдкреЗрдбрд╝ рдмрди рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ:
- рдЬрдбрд╝ рд╣реЛрдЧрд╛
x
- рдмрд╛рдИрдВ рд╕рдмрдЯреНрд░реА рд╕реВрдЪреА рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛,
xs
рд╕рдЦреНрддреА рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ x
рдФрд░ - рд╕рд╣реА рдЙрдк-рд╕реВрдЪреА рд╕реВрдЪреА рддрддреНрд╡реЛрдВ
xs
рд╕реЗ рдХрдбрд╝рд╛рдИ рд╕реЗ рдмрдбрд╝реА рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА x
ред
main = print $ treeFromList [7,2,4,8]
рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
Node 7 (Node 2 Empty (Node 4 Empty Empty)) (Node 8 Empty Empty)
рдпрд╣ рдПрдХ рд╕реВрдЪрдирд╛рддреНрдордХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкреЗрдбрд╝ рдХрд╛ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИред02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 30_Trees.lhs
02_Hard_Part / 31_Trees.lhsрдХреБрдЫ рдордЬрд╝реЗрджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреЗ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рдЖрдпрд╛, рдЬреЛ рдХрд┐рд╕реА рднреА рдкреЗрдбрд╝ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЖрдкрдХреЛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВредрд╣рдореЗрдВ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИредрд╣рдо deriving (Show)
рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ BinTree
ред рдпрд╣ рдмрд┐рдирдЯреНрд░реА рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ ( Eq
рдФрд░ Ord
) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ ред рдпрд╣ рд╣рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдЧрд╛ред data BinTree a = Empty | Node a (BinTree a) (BinTree a) deriving (Eq,Ord)
рдмрд┐рдирд╛ deriving (Show)
, рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛ show
редрд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ show
ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдирдпрд╛ рдмрдирд╛рдпрд╛ BinTree a
рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░, рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ Show
редрдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: instance Show (BinTree a) where show t = ...
рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╣ рдЙрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдЬреАрдм рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред
рддрд░реАрдХрд╛ treeFromList
рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред treeFromList :: (Ord a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x (treeFromList (filter (<x) xs)) (treeFromList (filter (>x) xs))
рдФрд░ рдЕрдм рд╣рдо рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: main = do putStrLn "Int binary tree:" print $ treeFromList [7,2,4,8,1,3,6,21,12,23]
print $ treeFromList [7,2,4,8,1,3,6,21,12,23] Int binary tree: < 7 : |
рдмрд╣реБрдд рдмреЗрд╣рддрд░! рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдХреЛ рдПрдХ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ <
ред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ :
редрд▓реЗрдХрд┐рди рд╣рдо рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред putStrLn "\nString binary tree:" print $ treeFromList ["foo","bar","baz","gor","yog"]
String binary tree: < "foo" : |
рдФрд░ рдЬрдм рд╕реЗ рд╣рдо рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдХреНрд░рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ! putStrLn "\n :" print ( treeFromList (map treeFromList ["baz","zara","bar"]))
: < < 'b' : : |
рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкрдВрдХреНрддрд┐ (рдореВрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рд╣реИ :
ред
putStrLn "\nTree of Binary trees of Char binary trees:" print $ (treeFromList . map (treeFromList . map treeFromList)) [ ["YO","DAWG"] , ["I","HEARD"] , ["I","HEARD"] , ["YOU","LIKE","TREES"] ]
рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ: print ( treeFromList ( map treeFromList [ map treeFromList ["YO","DAWG"] , map treeFromList ["I","HEARD"] , map treeFromList ["I","HEARD"] , map treeFromList ["YOU","LIKE","TREES"] ]))
рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк: Binary tree of Binary trees of Char binary trees: < < < 'Y' : : : `
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВредрдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреЗрдбрд╝ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ "I","HEARD"
ред рд╣рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ (рд▓рдЧрднрдЧ) рдореБрдлреНрдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЯреНрд░реА рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ Eq
редрдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╢рдХреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдВред рд╣рдо рди рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ, рд░реЗрдЦрд╛рдУрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рд╕реЗ рдмрдиреЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдкреЗрдбрд╝реЛрдВ рдХреЛ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдкреЗрдбрд╝ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рддрддреНрд╡ рдкреЗрдбрд╝ рдкреЗрдбрд╝ рд╣реИрдВ!02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 31_Trees.lhs
02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 40_Infinites_Structures.lhsрдЕрдВрддрд╣реАрди рд╕рдВрд░рдЪрдирд╛рдПрдВ
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдЕрдХреНрд╕рд░ рдПрдХ рдЖрд▓рд╕реА рднрд╛рд╖рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ редрд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рдирд╛ рд╕рд╣реА рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╕рдЦреНрдд рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ ред рдЖрд▓рд╕реНрдп рдЧреИрд░-рд╕рдЦреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИредрдПрдХ рд╢рд┐рдерд┐рд▓ рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рд╛рд╕реНрдХреЗрд▓-рд╡рд┐рдХреА рд╕реЗ:рдХрдЯреМрддреА (рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдгрд┐рддреАрдп рд╢рдмреНрдж) рдмрд╛рд╣рд░ рд╕реЗ рдЕрдВрджрд░ рддрдХ рдЬрд╛рддреА рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ (a+(b*c))
, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ +
, рдФрд░ рдлрд┐рд░ рдЖрдВрддрд░рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐(b*c)
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИредрдХреИрд╕реЗ?
рд╕рдм рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп
, рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИредрд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдВрддрд╣реАрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ [1..] тЗФ [1,2,3,4...] [1,3..] тЗФ [1,3,5,7,9,11...]
рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╝рдВрдХреНрд╢рди рдРрд╕реА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ take
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рдирдХ рд╕реБрд╡рд┐рдзрд╛ рднреА рд╣реИ take'
ред02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 40_Infinites_Structures.lhs
02_Hard_Part / 41_Infinites_Structures.lhsрдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╕реЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЕрдирдВрдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: nullTree = Node 0 nullTree nullTree
рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рдЯреНрд░реАред рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛: main = print $ treeTakeDepth 4 nullTree
рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ: < 0 : |
рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рд╣рд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдбрд╝ рдХреЛ рдЕрдЬреАрдм рдмрдирд╛рдпреЗрдВ: iTree = Node 0 (dec iTree) (inc iTree) where dec (Node xlr) = Node (x-1) (dec l) (dec r) inc (Node xlr) = Node (x+1) (inc l) (inc r)
рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рдкреЗрдбрд╝ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рд╣реИ map
, рд▓реЗрдХрд┐рди BinTree
рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП редрдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рд╕рдВрдХреЗрдд : рдореИрдВ рдЕрдм рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирд╣реАрдВ рдЕрдЯрдХреВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдк map
рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рджреЗрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ , рддреЛ рдлрд╝рдиреНрдиреЗрдЯрд░ рдФрд░ рдлрд╝рдВрдХреНрдЯрд░ рдХреАрд╡рд░реНрдб рдЦреЛрдЬреЗрдВ fmap
редрд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: infTreeTwo :: BinTree Int infTreeTwo = Node 0 (treeMap (\x -> x-1) infTreeTwo) (treeMap (\x -> x+1) infTreeTwo)
рдФрд░ рдЕрдорд▓ рдХрд╛ рдирддреАрдЬрд╛ main = print $ treeTakeDepth 4 infTreeTwo
< 0 : |
02_Hard_Part / 41_Infinites_Structures.lhs