Slide 1

Slide 1 text

Основы функционального программирования Введение в Haskell Сергей Бушняк @sigrlami

Slide 2

Slide 2 text

История ФП 20е XX века Проблема разрешимости Алгоритмика Существует ли алгоритм, за конечное число шагов определяющий истинность или ложность утверждения?

Slide 3

Slide 3 text

История ФП Вычислимость как процесс автоматизации решения проблемы используя небольшие, переиспользуемые части

Slide 4

Slide 4 text

История ФП Алан Тьюринг 1936г Механистическое видение Декомпозиция

Slide 5

Slide 5 text

История ФП Машина Тьюринга ● Состояние ● Пошаговое исполнение ● Таблица переходов архитектура фон Ньюмана - современные компьютеры

Slide 6

Slide 6 text

История ФП Алонзо Черч 1936г Функциональное видение От сложного к простому

Slide 7

Slide 7 text

История ФП λ - исчисление (lambda calculus) λx . x (λx.(λy.x)) (λf.(λg.(λx.(f(gx))))) -> λfgx.f(gx) Нет ничего кроме функций и их применений к другим функциям 0=λf.λx.x ; 1=λf.λx.f x ; 2=λf.λx.f(f x) ...

Slide 8

Slide 8 text

История ФП Хаскелл Брукс Карри Развитие λ - исчисления Каррирование f(x, y, z) = g(x)(y)(z)

Slide 9

Slide 9 text

История ФП Тюринг подтвердил что обе модели одинако строги в смысле что они решают один и тот же класс проблем 1936 В общем случае неразрешимы Редукционные машины. Вычислитель

Slide 10

Slide 10 text

История ФП Джон Маккарти 1959г Lisp Динамический Код есть данные REPL - Read Eval Print Loop

Slide 11

Slide 11 text

История ФП Lisp машины - Оптимизированы для ФП - Сохранение состояния - Автоматическая сборка мусора

Slide 12

Slide 12 text

Особенности ФП Функции - можно использовать так же как числа или переменные, - передавать в качестве аргумента - возвращать как результат - чистые ( детерминированы, нет побочных эффектов) Неизменяемость (immutability) - Результат вычисления не изменяет входной набор данных - Состояние это этап вычисления

Slide 13

Slide 13 text

Особенности ФП ФП оперирует фунцией и выполняет их композицию Процедурное программирование описывает набор операций

Slide 14

Slide 14 text

Особенности ФП ФП оперирует абстракциями и взаимодействиями ООП оперирует объектами и их состояниями. Функции применяются для изменения состояния объекта

Slide 15

Slide 15 text

Многообразие Динамически типизированные Статически типизированные

Slide 16

Slide 16 text

Многообразие Динамические языки имеют множество проблем, которые снижают преимущества функционального языка Поэтому мы будем работать с Haskell, наиболее развитым ФЯП на сегодня со статической типизацией

Slide 17

Slide 17 text

Haskell ➔ Чистый функциональный ➔ Статически типизированный ➔ Ленивый ➔ Емкий

Slide 18

Slide 18 text

Haskell Чистый - Функции не имеют побочных эффектов - При одних и тех же входных данных будут давать один и тот же результат - Чтение/Запись это работа с побочными эффектами, для них есть специальный механизм

Slide 19

Slide 19 text

Р Haskell Строгий - Несоответствие типов определяется на этапе компиляции - Никаких динамических приведений типов

Slide 20

Slide 20 text

H Haskell Ленивость - Отложенные вычисления - Можно задержать вычисления до того момента когда это будет действительно необходимо - Взамен расхода памяти, экономия процессорного времени

Slide 21

Slide 21 text

Haskell Емкий - Компактный код - Синтаксис разметки (отступы) можно обходиться без () {}

Slide 22

Slide 22 text

Haskell Где достать? Haskell платформа https://www.haskell.org/platform/ GHC (Glasgo Haskell Compiler) компилятор https://www.haskell.org/ghc/

Slide 23

Slide 23 text

Haskell Где брать модули/библиотеки? Hackage https://hackage.haskell.org/ Cabal https://www.haskell.org/cabal/

Slide 24

Slide 24 text

Haskell REPL GHCi идет вместе с платформой - среда для тестов - помощник при разработке

Slide 25

Slide 25 text

Haskell 1990г - начальная версия Стандарт Haskell 98 https://www.haskell.org/definition/haskell98-report.pdf Стандарт Haskell 2010 https://www.haskell.org/definition/haskell2010.pdf

Slide 26

Slide 26 text

Haskell Функции

Slide 27

Slide 27 text

Haskell Функции имя :: тип имя = определение

Slide 28

Slide 28 text

Haskell Определение функции

Slide 29

Slide 29 text

Haskell Абстракция типов Signal свой тип данных Integer стандартный тип данных shift - сдвигает сигнал на некоторое количество отсчетов

Slide 30

Slide 30 text

Haskell Стандартные типы данных Bool Integer String Float ...

Slide 31

Slide 31 text

Haskell Свои типы данных type A = B <- синоним data Bool = True | False <- новый тип данных data Int = -2147483648 | -2147483647 | ... | -1

Slide 32

Slide 32 text

Haskell Свои типы данных data Bool = True | False все что после “=” конструкторы значений data Freq = Freq Int Int - обертка, содерж 2 значения

Slide 33

Slide 33 text

Haskell Промежуточный итог - Функции более высокоуровневые => работа с прикладными понятиями - Отсутсвие побочных эффеектов - Определения = уравнение => можно говорить о свойствах и доказательсвах - Удобство рефакторинга - Легкость в организации параллельных вычислений

Slide 34

Slide 34 text

Haskell Prelude ядро платформы с набором предопределенных функциий на все случаи жизни

Slide 35

Slide 35 text

Haskell Коллекции Списки (Lists) [], [1, 2, 3, 4], [“abcd”, “abcde”] String = [Char]

Slide 36

Slide 36 text

Haskell Абстракция списков (List comprehensions) [1..10] [i, j | i <- [1..2] , j <-[1..5]] [2*x | x <-[1..], x^2>3]

Slide 37

Slide 37 text

Haskell Функции списков head, tail, init, last, … напиши свой

Slide 38

Slide 38 text

Haskell Операции над коллекциями Никаких явных циклов map (a->b)->[a]->[b] foldl (a -> b -> a) -> a -> [b] -> a foldr (a -> b -> b) -> b -> [a] -> b Рекурсии и абстракции

Slide 39

Slide 39 text

Haskell Hoogle поиск по типам https://www.haskell.org/hoogle/

Slide 40

Slide 40 text

Haskell module Ms1 ( squeeze , squeezePack) where import Data.List -- | Уберем последовательные дубликаты -- squeeze :: String -> String -- Eq a => [a] -> [a] squeeze [] = [] squeeze (x:xs) = x : (squeeze $ dropWhile (== x) xs)

Slide 41

Slide 41 text

Haskell

Slide 42

Slide 42 text

Haskell -- | Разобъем последовательные дубликаты -- на группы

Slide 43

Slide 43 text

Haskell Условные операторы в крайнем случае

Slide 44

Slide 44 text

Haskell Pattern-Matching везде, где только возможно

Slide 45

Slide 45 text

Haskell Применить дважды

Slide 46

Slide 46 text

Haskell Напишем свой мар

Slide 47

Slide 47 text

Haskell Язык общего назначения - Высоконагруженные веб-порталы (Yesod, Snap) - Компиляторы - Высокочастоный трейдинг - Распределенные вычисления - Параллельные вычисления

Slide 48

Slide 48 text

Haskell Вписывается в архитектуру любого приложения - FFI (Foreign Functions Interface) - Java-Bridge https://hackage.haskell.org/package/java-bridge

Slide 49

Slide 49 text

Haskell Потренироваться - перепишите squeezePack c помощью мар - напишите самостоятельно foldl по примеру map

Slide 50

Slide 50 text

Haskell Литература