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

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

рдкрд╣рд▓рд╛ рднрд╛рдЧ

рдмрд╣реБрд░реВрдкрддрд╛

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрд░реВрдкреА рд╣реИ рдпрджрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╣реБрд░реВрдкреА рдХрд╛рд░реНрдп рдкрд╣рдЪрд╛рди рд╕рдорд╛рд░реЛрд╣ рд╣реИ:
id :: a -> a id x = x 

рдмрд╣реБрдзрд╛, рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ):
 length :: [a] -> Int length [] = 0 length (_:l) = 1 + length l 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджрд╛рдпрд░рд╛ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛) рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЖрдо рдмреЛрд▓рдЪрд╛рд▓ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдмрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: "рдЕрд╢реЛрдХ рдХреА рдПрдХ рд╕реВрдЪреАред" рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рд╕реВрдЪреА рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдп рдмрд╣реБрд░реВрдкреА рд╣реИрдВред рдЖрд▓рд╕реА рдордд рдмрдиреЛ - рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдирд╛ред рдЗрд╕ рдмреАрдЪ, рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 filter :: (a -> Bool) -> [a] -> [a] filter p [] = [] filter p (x:xs) | px = x : filter p xs | otherwise = filter p xs 

рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдмрд╣реБрд░реВрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдбреЛрдореЗрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 error :: String -> a 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдмрд╣реБрд░реВрдкреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд:
 undefined :: a undefined = error "Prelude.undefined" 

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

рдСрдкрд░реЗрдЯрд░реЛрдВ

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рдмреАрдЪ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдЗрдиреНрдлрд┐рдХреНрд╕ рдпрд╛, рдмрд╕, рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред (рд╢рдмреНрдж рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рд╢рд░реНрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдХреЛрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ)ред
рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдкрдХреЛ рдХрдерди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
": # $% * + - =ред / \ <>? @ ^ | "
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдЖрдкрдХреА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
":: = ... - @ \ | | <- -> ~ => "
рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдирд╛рдо рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди рдореЗрдВ рд╕рдорд╛рди рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 (%%) :: Int -> Int -> (Int, Int) (%%) xy = (div xy, rem xy) 

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

рд╕рд╣рдХрд╛рд░рд┐рддрд╛ рджреНрд╡рд╛рд░рд╛, рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд╕рд╛рд╣рдЪрд░реНрдп, рджрд╛рдИрдВ рдУрд░ рд╕рд╛рд╣рдЪрд░реНрдп, рдмрд╛рдИрдВ рдУрд░ рд╕рд╛рд╣рдЪрд░реНрдп рдФрд░ рдЧреИрд░-рд╕рд╛рдорд╛рдЬрд┐рдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреБрдЫ рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░ "\ /":

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ:

рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдСрдкрд░реЗрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдФрд░ рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП:
 infixr 7 -- ,  7 (\/) :: Bool -> Bool -> Bool (\/) xy = ... 


рдорд╛рдирдХ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ рдФрд░ рд╕рдВрдмрджреНрдзрддрд╛:
 infixr 9 . infixl 9 !! infixr 8 ^, ^^, ** infixl 7 *, /, `quot`, `rem`, `div`, `mod`, :%, % infixl 6 +, - infixr 5 :, ++ infix 4 ==, /=, <, <=, >=, >, `elem`, `notElem` infixr 3 && infixr 2 || infixl 1 >>, >>= infixr 1 =<< infixr 0 $, $!, `seq` 

currying

рддреЛ, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 plus :: (Integer, Integer) -> Integer plus (x, y) = x + y 

рдкреНрд▓рд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рддрд░реНрдХ рд╣реИред рдпрд╣ рддрд░реНрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИред
рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 plus :: Integer -> Integer -> Integer plus xy = x + y 

рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рддрд░реНрдХ рднреА рд╣реИ (рдФрд░ рджреЛ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ), рдпрд╣ рддрд░реНрдХ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдЯреЗрдЧрд░ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдмрд╛рд░ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд░реАрдХрд░рдг рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ (рдЕрдореЗрд░рд┐рдХреА рддрд░реНрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдмреА рдХрд░реА рдХреЗ рдирд╛рдо рд╕реЗ)ред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЛ "рдлреАрдб" рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдлрдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
 successor :: Integer -> Integer successor = plus 1 

рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХрд░реА рдФрд░ рдЕрд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░реАрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд:
 curry :: ((a, b) -> c) -> a -> b -> c curry fxy = f (x, y) uncurry :: (a -> b -> c) -> ((a, b) -> c) uncurry fp = f (fst p) (snd p) 

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

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


All Articles