рдХрд╛рдВрдЯреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ред 1/2



рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХрдард┐рди рдкрд░рд┐рдЪрдп рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧред рджреВрд╕рд░рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

tl; dr : рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдпред


рдпреБрдкреАрдбреАред рдпрджрд┐ рдЖрдкрдХреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ, рддреЛ рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЫреЛрдбрд╝реЗрдВред рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╕рдиреНрди рд╣реЛрдЧрд╛;)

рдореЗрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╕реБрдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓-рдирд┐рдВрдЬрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╕ рдЙрди рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдЖрдкрдХреА рдЪреЗрддрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред


рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рднрд╛рд╖рд╛рдПрдБ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ



рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрдирд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдЙрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдЖрдкрдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред


рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдЕрдзреНрдпрдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рдХрдореА рдереАред

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

рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рджреЛ рдХрд┐рддрд╛рдмреЗрдВ рдкрдврд╝рдирд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рдЖрдк рдПрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦреЗрдВ" , рдФрд░ рдлрд┐рд░ "рд░рд┐рдпрд▓ рд╡рд░реНрд▓реНрдб рд╣рд╛рд╕реНрдХреЗрд▓" ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рдкреБрд╕реНрддрдХреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред


рджреВрд╕рд░реА рдУрд░, рдпрд╣ рд▓реЗрдЦ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЬреЛ рд╣рд╕реНрдХреЗрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдпрд╛рдж рдЖ рд░рд╣реА рдереАрдВред


рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдБрдЪ рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:



рдиреЛрдЯ: рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ .lhs рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рджреЗрдЦрддреЗ рд╣реИрдВ,
рдЖрдк рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ filename.lhs рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рддреЛ, рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ
runhaskell рдлрд╝рд╛рдЗрд▓ рдирд╛рдоред lhs


рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдиреАрдЪреЗ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП




01_basic / 10_Introduction / 00_hello_world.lhs


рдкрд░рд┐рдЪрдп



рд╕реНрдерд╛рдкрдирд╛







рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ:




рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ





рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рдФрд░ рд▓реЗрдЦ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧреВрдврд╝ рд╕реВрддреНрд░реЛрдВ (рддреНрд╡рд░рд┐рдд рдкреНрд░рдХрд╛рд░, рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рддреБрд░рдВрдд рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдорд╣рд╛рд╢рдХреНрддрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдореИрдВ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдирдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдкрд░рд┐рдЪрд┐рдд тАЬрд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдбтАЭ рд╕реЗред


 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 ++ "!") 


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

 # Python print "  ?" name = raw_input() print " %s!" % name 


 # Ruby puts "  ?" name = gets.chomp puts " #{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 рдирд╣реАрдВред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ред


рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг



рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИред

рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВред
 --     :: f :: Int -> Int -> Int fxy = x*x + y*y main = print (f 2 3) 


 ~ 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 рдХреЗ рджрд╛рдИрдВ рдУрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░рдореВрд▓реНрдп
IntInt рд▓рд┐рдЦреЗрдВ
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) --   ,   x тЙа  y 


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

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

01_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) ред
рдПрдХ рдЯрдкрд▓ рдХреЗ рддрддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

 --    -  (2,"foo") (3,'a',[2,3]) ((2,"a"),"c",3) fst (x,y) тЗТ x snd (x,y) тЗТ y fst (x,y,z) тЗТ ERROR: fst :: (a,b) -> a snd (x,y,z) тЗТ ERROR: snd :: (a,b) -> b 



рд╣рдо рдХреЛрд╖реНрдардХ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ


рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ($) рдФрд░ (.) ред

 --  : fghx тЗФ (((fg) h) x) -- $    $ --    fg $ hx тЗФ fg (hx) тЗФ (fg) (hx) f $ ghx тЗФ f (ghx) тЗФ f ((gh) x) f $ g $ hx тЗФ f (g (hx)) -- (.)   (f . g) x тЗФ f (gx) (f . g . h) x тЗФ f (g (hx)) 




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) { // if the list is empty return n; } else { x = list[0]; // let x be the first element of the list xs = list+1; // let xs be the list without x if ( 0 == (x%2) ) { // if x is even return accumSum(n+x, xs); } else { return accumSum(n, xs); } } } 

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

 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 рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рд╕рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 --  1 evenSum :: [Integer] -> Integer evenSum l = accumSum 0 l accumSum nl = if l == [] then n else let x = head l xs = tail l in if even x then accumSum (n+x) xs else accumSum n xs 


рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ 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 ред

 --  2 evenSum :: Integral a => [a] -> a evenSum l = accumSum 0 l where accumSum nl = if l == [] then n else let x = head l xs = tail l in if even x then accumSum (n+x) xs else accumSum n xs 


02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 12_Functions.lhs



02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 13_Functions.lhs

рдЕрдм рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 --  3 evenSum l = accumSum 0 l where accumSum n [] = n accumSum n (x:xs) = if even x then accumSum (n+x) xs else accumSum n xs 


рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдХреЗрд╡рд▓ рдирд╛рдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред (рд╕рдмрд╕реЗ рд╕рд╛рд╣рд╕реА рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ )

рдЗрд╕ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп: 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 рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 --  4 evenSum :: Integral a => [a] -> a evenSum = accumSum 0 where accumSum n [] = n accumSum n (x:xs) = if even x then accumSum (n+x) xs else accumSum n xs 

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 


рд╣рдо рдЫреЛрдЯреЗ рдХрджрдореЛрдВ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
 --  5 evenSum l = mysum 0 (filter even l) where mysum n [] = n mysum n (x:xs) = mysum (n+x) xs 

рдЬрд╣рд╛рдБ

 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 рдХрд╛ рд╣рдорд╛рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 --  6 -- foldl'     --       Data.List import Data.List evenSum l = foldl' mysum 0 (filter even l) where mysum acc value = acc + value 

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

 --  7 --     --     import Data.List (foldl') evenSum l = foldl' (\xy -> x+y) 0 (filter even l) 

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 (\xy -> x+y) тЗФ (+) 

02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 15_Functions.lhs



02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 16_Functions.lhs

рдЕрдВрдд рдореЗрдВ
 --  8 import Data.List (foldl') evenSum :: Integral a => [a] -> a evenSum l = foldl' (+) 0 (filter even l) 

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)) 


рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдФрд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 --  9 import Data.List (foldl') evenSum :: Integral a => [a] -> a evenSum = (foldl' (+) 0) . (filter even) 


рдХреЛрдб рдХреНрд▓реАрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреБрдЫ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 --  10 import Data.List (foldl') sum' :: (Num a) => [a] -> a sum' = foldl' (+) 0 evenSum :: Integral a => [a] -> a evenSum = sum' . (filter even) 


рд╣рдо рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛?

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

 [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> --   Data.Complex Prelude> :m Data.Complex Prelude Data.Complex> square (2 :+ 1) 3.0 :+ 4.0 

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)) 


рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред
рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж:



 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 = ... --      


рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╣ рдЙрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдЬреАрдм рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред

 --   BinTree   Show instance (Show a) => Show (BinTree a) where --     '<' --   :    show t = "< " ++ replace '\n' "\n: " (treeshow "" t) where -- treeshow pref Tree --        pref --       treeshow pref Empty = "" -- Leaf treeshow pref (Node x Empty Empty) = (pshow pref x) --    treeshow pref (Node x left Empty) = (pshow pref x) ++ "\n" ++ (showSon pref "`--" " " left) --    treeshow pref (Node x Empty right) = (pshow pref x) ++ "\n" ++ (showSon pref "`--" " " right) --        treeshow pref (Node x left right) = (pshow pref x) ++ "\n" ++ (showSon pref "|--" "| " left) ++ "\n" ++ (showSon pref "`--" " " right) --      showSon pref before next t = pref ++ before ++ treeshow (pref ++ next) t -- pshow  "\n"  "\n"++pref pshow pref x = replace '\n' ("\n"++pref) (show x) --    replace c new string = concatMap (change c new) string where change c new x | x == c = new | otherwise = x:[] -- "x" 


рддрд░реАрдХрд╛ 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 : |--2 : | |--1 : | `--4 : | |--3 : | `--6 : `--8 : `--21 : |--12 : `--23 


рдмрд╣реБрдд рдмреЗрд╣рддрд░! рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдХреЛ рдПрдХ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ <ред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ :ред
рд▓реЗрдХрд┐рди рд╣рдо рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 putStrLn "\nString binary tree:" print $ treeFromList ["foo","bar","baz","gor","yog"] 


 String binary tree: < "foo" : |--"bar" : | `--"baz" : `--"gor" : `--"yog" 


рдФрд░ рдЬрдм рд╕реЗ рд╣рдо рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдХреНрд░рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ!

 putStrLn "\n      :" print ( treeFromList (map treeFromList ["baz","zara","bar"])) 


       : < < 'b' : : |--'a' : : `--'z' : |--< 'b' : | : |--'a' : | : `--'r' : `--< 'z' : : `--'a' : : `--'r' 

рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкрдВрдХреНрддрд┐ (рдореВрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рд╣реИ :ред



 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' : : : `--'O' : : `--< 'D' : : : |--'A' : : : `--'W' : : : `--'G' : |--< < 'I' : | : `--< 'H' : | : : |--'E' : | : : | `--'A' : | : : | `--'D' : | : : `--'R' : `--< < 'Y' : : : `--'O' : : : `--'U' : : `--< 'L' : : : `--'I' : : : |--'E' : : : `--'K' : : `--< 'T' : : : `--'R' : : : |--'E' : : : `--'S' 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреЗрдбрд╝ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ "I","HEARD"ред рд╣рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ (рд▓рдЧрднрдЧ) рдореБрдлреНрдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЯреНрд░реА рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ Eqред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╢рдХреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдВред рд╣рдо рди рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ, рд░реЗрдЦрд╛рдУрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рд╕реЗ рдмрдиреЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдкреЗрдбрд╝реЛрдВ рдХреЛ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдкреЗрдбрд╝ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рддрддреНрд╡ рдкреЗрдбрд╝ рдкреЗрдбрд╝ рд╣реИрдВ!


02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 31_Trees.lhs



02_рд╣рд╛рд░реНрдб_рдкрд╛рд░реНрдЯ / 40_Infinites_Structures.lhs

рдЕрдВрддрд╣реАрди рд╕рдВрд░рдЪрдирд╛рдПрдВ



рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдЕрдХреНрд╕рд░ рдПрдХ рдЖрд▓рд╕реА рднрд╛рд╖рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рдирд╛ рд╕рд╣реА рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╕рдЦреНрдд рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ ред рдЖрд▓рд╕реНрдп рдЧреИрд░-рд╕рдЦреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

рдПрдХ рд╢рд┐рдерд┐рд▓ рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рд╛рд╕реНрдХреЗрд▓-рд╡рд┐рдХреА рд╕реЗ:

рдХрдЯреМрддреА (рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдгрд┐рддреАрдп рд╢рдмреНрдж) рдмрд╛рд╣рд░ рд╕реЗ рдЕрдВрджрд░ рддрдХ рдЬрд╛рддреА рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ (a+(b*c)), рддреЛ рдЖрдк рдкрд╣рд▓реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ +, рдФрд░ рдлрд┐рд░ рдЖрдВрддрд░рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐(b*c)


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 -- numbers = [1,2,..] numbers :: [Integer] numbers = 0:map (1+) numbers take' n [] = [] take' 0 l = [] take' n (x:xs) = x:take' (n-1) xs main = print $ take' 10 numbers 


рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдХреИрд╕реЗ?

рд╕рдм рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп , рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдВрддрд╣реАрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ

 [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 


рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рдЯреНрд░реАред рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 --    BinTree --      treeTakeDepth _ Empty = Empty treeTakeDepth 0 _ = Empty treeTakeDepth n (Node x left right) = let nl = treeTakeDepth (n-1) left nr = treeTakeDepth (n-1) right in Node x nl nr 


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:

 main = print $ treeTakeDepth 4 nullTree 


рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 < 0 : |-- 0 : | |-- 0 : | | |-- 0 : | | `-- 0 : | `-- 0 : | |-- 0 : | `-- 0 : `-- 0 : |-- 0 : | |-- 0 : | `-- 0 : `-- 0 : |-- 0 : `-- 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рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 --      Tree treeMap :: (a -> b) -> BinTree a -> BinTree b treeMap f Empty = Empty treeMap f (Node x left right) = Node (fx) (treeMap f left) (treeMap f right) 


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

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

 infTreeTwo :: BinTree Int infTreeTwo = Node 0 (treeMap (\x -> x-1) infTreeTwo) (treeMap (\x -> x+1) infTreeTwo) 

рдФрд░ рдЕрдорд▓ рдХрд╛ рдирддреАрдЬрд╛
 main = print $ treeTakeDepth 4 infTreeTwo 


 < 0 : |-- -1 : | |-- -2 : | | |-- -3 : | | `-- -1 : | `-- 0 : | |-- -1 : | `-- 1 : `-- 1 : |-- 0 : | |-- -1 : | `-- 1 : `-- 2 : |-- 1 : `-- 3 


02_Hard_Part / 41_Infinites_Structures.lhs

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


All Articles