Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Функциональное программирование - Александр Алексеев

233 views

Published on

Функциональное программирование

Published in: Software
  • Be the first to comment

  • Be the first to like this

Функциональное программирование - Александр Алексеев

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

×