Основы
функционального
программирования
Введение в 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
Особенности ФП
ФП оперирует абстракциями и
взаимодействиями
ООП оперирует объектами и их
состояниями. Функции применяются для
изменения состояния объекта
Многообразие
Динамические языки имеют множество
проблем, которые снижают преимущества
функционального языка
Поэтому мы будем работать с Haskell,
наиболее развитым ФЯП на сегодня со
статической типизацией
Haskell
Чистый
- Функции не имеют побочных эффектов
- При одних и тех же входных данных будут
давать один и тот же результат
- Чтение/Запись это работа с побочными
эффектами, для них есть специальный
механизм
Slide 19
Slide 19 text
Р Haskell
Строгий
- Несоответствие типов определяется на
этапе компиляции
- Никаких динамических приведений типов
Slide 20
Slide 20 text
H Haskell
Ленивость - Отложенные вычисления
- Можно задержать вычисления до того
момента когда это будет действительно
необходимо
- Взамен расхода памяти, экономия
процессорного времени
Slide 21
Slide 21 text
Haskell
Емкий
- Компактный код
- Синтаксис разметки (отступы) можно
обходиться без () {}
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
ядро платформы с набором
предопределенных функциий на все случаи
жизни
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/