![Page 1: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/1.jpg)
Функциональноепрограммирование
Александр Алексеев
![Page 2: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/2.jpg)
Парадигмыпрограммирования
![Page 3: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/3.jpg)
– Процедурное программирование– Объектно-ориентированное программирование– Функциональное программирование– Логическое программирование– и другие...
![Page 4: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/4.jpg)
Процедурноепрограммирование
![Page 5: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/5.jpg)
![Page 6: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/6.jpg)
– Pascal– Си– и другие...
Языки процедурного программирования:
![Page 7: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/7.jpg)
Объектно-ориентированное
программирование
![Page 8: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/8.jpg)
![Page 9: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/9.jpg)
– Java– C#– Delphi (Object Pascal)– C++– Python– Perl, Perl 6– PHP5– и многие другие
ООП-языки:
![Page 10: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/10.jpg)
Функциональноепрограммирование
Функциональноепрограммирование
![Page 11: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/11.jpg)
Функциональноепрограммирование
Все очень просто!
![Page 12: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/12.jpg)
![Page 13: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/13.jpg)
Основы(на примере Haskell)
![Page 14: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/14.jpg)
data Bool = True | False
![Page 15: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/15.jpg)
data Bool = True | False
positive :: Int → Boolpositive x = x > 0
![Page 16: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/16.jpg)
data Bool = True | False
positive :: Int → Boolpositive x = x > 0
max :: (Ord a) => a → a → amax x y | x > y = x | otherwise = y
![Page 17: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/17.jpg)
data Person = Person { firstName :: String, lastName :: String, birthYear :: Int } deriving (Show)
![Page 18: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/18.jpg)
data Person = Person { firstName :: String, lastName :: String, birthYear :: Int } deriving (Show)
alex = Person { firstName = "Александр", lastName = "Алексеев", birthYear = 1988 }
![Page 19: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/19.jpg)
class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)
![Page 20: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/20.jpg)
class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)
instance Eq Person where x == y = birthYear x == birthYear y
![Page 21: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/21.jpg)
class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)
instance Eq Person where x == y = birthYear x == birthYear y x /= y = not (x == y)
![Page 22: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/22.jpg)
anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }
![Page 23: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/23.jpg)
anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }
alex == anton False
![Page 24: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/24.jpg)
anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }
alex == anton Falsealex == alex True
![Page 25: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/25.jpg)
anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }
alex == anton Falsealex == alex Trueanton == alex False
![Page 26: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/26.jpg)
anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }
alex == anton Falsealex == alex Trueanton == alex Falseanton /= alex True
![Page 27: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/27.jpg)
instance Ord Person where compare x y = compare (birthYear y) (birthYear x)
![Page 28: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/28.jpg)
instance Ord Person where compare x y = compare (birthYear y) (birthYear x)
instance Ord Person where x `compare` y = birthYear y `compare` birthYear x
![Page 29: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/29.jpg)
instance Ord Person where compare x y = compare (birthYear y) (birthYear x)
instance Ord Person where x `compare` y = birthYear y `compare` birthYear x
max :: (Ord a) => a → a → a
![Page 30: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/30.jpg)
instance Ord Person where compare x y = compare (birthYear y) (birthYear x)
instance Ord Person where x `compare` y = birthYear y `compare` birthYear x
max :: (Ord a) => a → a → a
max alex anton
![Page 31: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/31.jpg)
instance Ord Person where compare x y = compare (birthYear y) (birthYear x)
instance Ord Person where x `compare` y = birthYear y `compare` birthYear x
max :: (Ord a) => a → a → a
max alex anton
birthYear (max alex anton) == 1988
![Page 32: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/32.jpg)
Каррирование(англ. currying)
![Page 33: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/33.jpg)
max :: (Ord a) => a → a → a
![Page 34: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/34.jpg)
max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)
![Page 35: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/35.jpg)
max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)
max' = max alex
![Page 36: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/36.jpg)
max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)
max' = max alexmax' :: Person → Person
![Page 37: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/37.jpg)
max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)
max' = max alexmax' :: Person → Person
max' anton :: Person
![Page 38: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/38.jpg)
max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)
max' = max alexmax' :: Person → Person
max' anton :: PersonbirthYear (max' anton) == 1988
![Page 39: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/39.jpg)
Лямбда-функции
![Page 40: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/40.jpg)
Лямбда-функции
(λ)
![Page 41: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/41.jpg)
![Page 42: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/42.jpg)
(\x y → x + y)
![Page 43: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/43.jpg)
(\x y → x + y)(\x y → x + y) :: ?
![Page 44: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/44.jpg)
(\x y → x + y)(\x y → x + y) :: Num a => a → a → a
![Page 45: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/45.jpg)
(\x y → x + y)(\x y → x + y) :: Num a => a → a → a
(\x y → x + y) 3 4
![Page 46: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/46.jpg)
(\x y → x + y)(\x y → x + y) :: Num a => a → a → a
(\x y → x + y) 3 4(\x y → x + y) 3 4 == 7
![Page 47: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/47.jpg)
Кортежи
![Page 48: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/48.jpg)
(1, 2)
![Page 49: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/49.jpg)
(1, 2)('a', 'b')
![Page 50: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/50.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)
![Page 51: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/51.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')
![Page 52: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/52.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')
![Page 53: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/53.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )
![Page 54: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/54.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)
![Page 55: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/55.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)
fst (1, 2) == 1
![Page 56: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/56.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)
fst (1, 2) == 1snd (1, 2) == 2
![Page 57: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/57.jpg)
(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)
fst (1, 2) == 1snd (1, 2) == 2snd (1, (2, 'a'), 3) == (2, 'a')
![Page 58: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/58.jpg)
Списки
![Page 59: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/59.jpg)
[1, 2, 3]['a', 'b', 'c'][ ][ [1, 2], [3, 4] ][ (1, 'a'), (2, 'b'), (3, 'c') ]
head :: [a] → ahead [4, 8, 15, 16, 23, 42] == 4
tail :: [a] → [a]tail [4, 8, 15, 16, 23, 42] == [8, 15, 16, 23, 42]
![Page 60: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/60.jpg)
head :: [a] → ahead [4, 8, 15, 16, 23, 42] == 4
tail :: [a] → [a]tail [4, 8, 15, 16, 23, 42] == [8, 15, 16, 23, 42]
init :: [a] → [a]init [4, 8, 15, 16, 23, 42] == [4, 8, 15, 16, 23]
last :: [a] → alast [4, 8, 15, 16, 23, 42] == 42
![Page 61: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/61.jpg)
length :: [a] → Intlength [4, 8, 15, 16, 23, 42] == 6
null :: [a] → Boolnull [ ] == True null [1, 2, 3] == False
reverse [1, 2, 3] == [3, 2, 1]take 3 [1, 2, 3, 4, 5] == [1, 2, 3]drop 3 [1, 2, 3, 4, 5] == [4, 5]sum [1, 2, 3, 4, 5] == 15[1, 2, 3] ++ [4, 5] == [1, 2, 3, 4, 5]
![Page 62: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/62.jpg)
Генераторысписков,
интервалы,ленивые вычисления
![Page 63: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/63.jpg)
[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]
![Page 64: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/64.jpg)
[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]
[1..5] == [1, 2, 3, 4, 5][2,4..10] == [2, 4, 6, 8, 10][1..] == [1, 2, 3, 4, 5, 6, 7, 8, 9, …]take 3 [1..] == [1, 2, 3]
![Page 65: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/65.jpg)
[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]
[1..5] == [1, 2, 3, 4, 5][2,4..10] == [2, 4, 6, 8, 10][1..] == [1, 2, 3, 4, 5, 6, 7, 8, 9, …]take 3 [1..] == [1, 2, 3]
cycle [1, 2, 3] == [1, 2, 3, 1, 2, 3, 1, 2, 3, … ]take 5 $ cycle [1, 2, 3] == [1, 2, 3, 1, 2]
![Page 66: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/66.jpg)
Функциивысшего порядка
![Page 67: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/67.jpg)
![Page 68: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/68.jpg)
filter :: (a -> Bool) -> [a] -> [a]
![Page 69: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/69.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
![Page 70: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/70.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]
![Page 71: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/71.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]map (\x → x + 5) [1,2,3] == [6,7,8]
![Page 72: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/72.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]
![Page 73: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/73.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]
foldl :: (a -> b -> a) -> a -> [b] -> a
![Page 74: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/74.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]
foldl :: (a -> b -> a) -> a -> [b] -> afoldl (\s x -> x + s) 0 [1, 2, 3] == 6
![Page 75: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/75.jpg)
filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]
map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]
foldl :: (a -> b -> a) -> a -> [b] -> afoldl (\s x -> x + s) 0 [1, 2, 3] == 6
sum = foldl (\s x -> x + s) 0
![Page 76: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/76.jpg)
Пишемсобственные
функции
![Page 77: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/77.jpg)
null' :: [a] → Bool
![Page 78: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/78.jpg)
null' :: [a] → Boolnull' [ ] = True
![Page 79: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/79.jpg)
null' :: [a] → Boolnull' [ ] = Truenull' _ = False
![Page 80: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/80.jpg)
null' :: [a] → Boolnull' [ ] = Truenull' _ = False
head' :: [a] → a
![Page 81: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/81.jpg)
null' :: [a] → Boolnull' [ ] = Truenull' _ = False
head' :: [a] → ahead' (x:xs) = x
![Page 82: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/82.jpg)
null' :: [a] → Boolnull' [ ] = Truenull' _ = False
head' :: [a] → ahead' (x:xs) = xhead' _ = error 'Empty list!'
![Page 83: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/83.jpg)
null' :: [a] → Boolnull' [ ] = Truenull' _ = False
head' :: [a] → ahead' (x:xs) = xhead' _ = error 'Empty list!'
[1, 2, 3] == (1:(2:(3:[])))
![Page 84: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/84.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> a
![Page 85: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/85.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xs
![Page 86: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/86.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
![Page 87: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/87.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Bool
![Page 88: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/88.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | ...
![Page 89: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/89.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yx
![Page 90: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/90.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False
![Page 91: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/91.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False
elem' 1 [1, 2, 3] == True
![Page 92: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/92.jpg)
foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc
elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False
elem' 1 [1, 2, 3] == True elem' 7 [1, 2, 3] == False
![Page 93: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/93.jpg)
За кадром остались:
![Page 94: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/94.jpg)
За кадром остались:– параметризованные типы
![Page 95: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/95.jpg)
За кадром остались:– параметризованные типы– монады
![Page 96: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/96.jpg)
За кадром остались:– параметризованные типы– монады– ввод/вывод
![Page 97: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/97.jpg)
За кадром остались:– параметризованные типы– монады– ввод/вывод– аппликативные функторы
![Page 98: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/98.jpg)
За кадром остались:– параметризованные типы– монады– ввод/вывод– аппликативные функторы– застежки
![Page 99: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/99.jpg)
Зачем все это нужно:
![Page 100: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/100.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность
![Page 101: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/101.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью
![Page 102: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/102.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов
![Page 103: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/103.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание
![Page 104: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/104.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание– Строгая типизация
![Page 105: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/105.jpg)
Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание– Строгая типизация– и не только
![Page 106: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/106.jpg)
Насколько быстр Haskell?
![Page 107: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/107.jpg)
Насколько быстр Haskell?
![Page 108: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/108.jpg)
Что можно написать на Haskell?
![Page 109: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/109.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)
![Page 110: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/110.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)
![Page 111: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/111.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)
![Page 112: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/112.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)
![Page 113: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/113.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)– модули ядра Linux
![Page 114: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/114.jpg)
Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)– модули ядра Linux– и многое другое
![Page 115: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/115.jpg)
Другие ФП-языки:
![Page 116: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/116.jpg)
Другие ФП-языки:– Erlang
![Page 117: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/117.jpg)
Другие ФП-языки:– Erlang– OCaml
![Page 118: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/118.jpg)
Другие ФП-языки:– Erlang– OCaml– Standart ML
![Page 119: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/119.jpg)
Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp
![Page 120: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/120.jpg)
Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket
![Page 121: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/121.jpg)
Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket– Clojure
![Page 122: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/122.jpg)
Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket– Clojure– и другие
![Page 123: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/123.jpg)
Литературапо ФП
![Page 124: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/124.jpg)
![Page 125: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/125.jpg)
![Page 126: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/126.jpg)
![Page 127: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/127.jpg)
Подборка ссылок:
![Page 129: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/129.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/
![Page 130: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/130.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/
![Page 131: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/131.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian
![Page 132: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/132.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian
![Page 133: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/133.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian
![Page 134: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/134.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian– http://habrahabr.ru/hub/haskell
![Page 135: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/135.jpg)
Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian– http://habrahabr.ru/hub/haskell– http://goo.gl/VUvjk (эта презентация)
![Page 136: Функциональное программирование - Александр Алексеев](https://reader034.vdocuments.site/reader034/viewer/2022050806/589e7ffb1a28ab300b8b6f2f/html5/thumbnails/136.jpg)
Спасибо за внимание!
Александр Алексеев
http://eax.me/