SlideShare a Scribd company logo
Алгебраические типы данных
Алгебраические типы данных
- типы получаемые из других типов с помощью
алгебраических операций
Простые типы
● Int
● Double
● Bool
● Char
● String
Функции с 1 аргументом
incr x = x + 1
Функции с 1 аргументом
incr x = x + 1
fact 0 = 1
fact n = fact (n-1) * n
Функции с 2 аргументами
add (x, y) = x + y
Функции с 2 аргументами
add (x, y) = x + y
mul (0, _) = 0
mul (1, x) = x
mul (n, x) = mul (n-1, x) + x
Типы функций
incr :: Int -> Int
fact :: Int -> Int
add :: (Int, Int) -> Int
mul :: (Int, Int) -> Int
Горькая правда о парах
mul :: (Int, Int) -> Int
mul (n, x) = n * x
mul pair = (fst pair) * (snd pair)
Что такое пара?
● Просто два значения собранные вместе.
● Множество пар – декартово произведение
множеств.
● Пара – составной тип.
Как же сделать функцию
нескольких аргументов?
● Никак.
● Эмулировать с помощью пар.
● Эмулировать с помощью каррирования.
Лямбды
incr x = x + 1
incr = x -> x + 1
Лямбды
incr x = x + 1
incr = x -> x + 1
incr 10 -- 11
Лямбды и каррирование
add = (x -> (y -> x + y))
Лямбды и каррирование
add = (x -> (y -> x + y))
add x = (y -> x + y)
Лямбды и каррирование
add = (x -> (y -> x + y))
add x = (y -> x + y)
add x y = x + y
Каррирование
add x y = x + y
add 3 4 -- 7
Каррирование
add x y = x + y
add 3 4 -- 7
(add 3) 4 -- 7
Тип каррированной функции
add :: Int -> (Int -> Int)
Тип каррированной функции
add :: Int -> (Int -> Int)
add :: Int -> Int -> Int
Тип каррированной функции
add :: Int -> (Int -> Int)
add :: Int -> Int -> Int
-- не то же самое:
add :: (Int -> Int) -> Int
Частичное применение
add10 = add 10
add10 3 -- 13
Частичное применение
add10 = add 10
add10 3 -- 13
map (add 5) [1,2,3]
-- [6,7,8]
Алгебраические типы данных
● Типы произведения.
● Типы суммы.
Тип-произведение
– имеет по значению для каждого из своих
компонентов
Тип-произведение
– декартово произведение своих
составляющих
Тип-произведение
● Кортежи
● Записи
● struct в c
● Объекты
Кортежи
(1, 2, 3) :: (Int, Int, Int)
('x', 'a') :: (Char, Char)
('x', 42) :: (Char, Int)
Кортежи
(incr, mul) :: (Int -> Int,
(Int, Int) -> Int)
(1,(2,3)) :: (Int,(Int,Int))
Записи
data Point = Point Int Int
data Person
= Person {name :: String,
age :: Int}
Записи
Point 10 20
Person {name = "Alice", age = 25}
Person {age = 25, name = "Alice"}
Person "Alice" 25
Конструкторы записей
Person :: String -> Int -> Person
(Person "Alice") :: Int -> Person
Конструкторы записей
Person :: String -> Int -> Person
(Person "Alice") :: Int -> Person
map (Person "Alice") [10, 20, 30]
Конструкторы записей
lame (Person n a) = n ++ " is "
++ (show a) ++ " years old"
lame p = (name p) ++ " is "
++ (show (age p)) ++ " years old"
Тип-сумма
– имеет значение одного из своих
компонентов за раз
Тип-сумма
– объединение множеств своих
составляющих
Тип-сумма
● union в c
● variant
● динамические типы
Объединения
data Value = Exact Double
| Range Double Double
data Gender = Male | Female
data Person = Person String Gender
Объединения
valueLen (Exact _) = 0
valueLen (Range x y) = y - x
Объединения
data NamedVal = NamedVal String Value
f (NamedValue s v) = ...
f (NamedValue s (Exact x)) = ...
f (NamedValue s (Range x y)) = ...
Полиморфизм функций
add :: (Int, Int) -> Int
add :: (Double, Double) -> Double
...
Полиморфизм функций
identity x = x
identity :: a -> a
Полиморфизм функций
identity x = x
identity :: a -> a
flip (x, y) = (y, x)
flip :: (a, b) -> (b, a)
Полиморфизм типов
data Maybe a = Nothing | Just a
data Either a b = Left a | Right b
Полиморфизм типов
justP (x, y) = (Just x, Just y)
Полиморфизм типов
justP (x, y) = (Just x, Just y)
justP :: (a, b) -> (Maybe a, Maybe b)
Полиморфные рекурсивные типы
data List a = Empty | Cons a (List a)
Empty
Cons 1 Empty
Cons 1 (Cons 2 Empty)
Полиморфные рекурсивные типы
data List a = Empty | Cons a (List a)
Cons "1" (Cons "2" Empty)
-- не сработает:
Cons "1" (Cons 2 Empty)
Полиморфные рекурсивные типы
len Empty = 0
len (Cons _ tail) = 1 + len tail
len :: List a -> Int
Настоящие списки
data [a] = [] | a : [a]
length [] = 0
length x:xs = 1 + length xs
Настоящие списки
data [a] = [] | a : [a]
type String = [Char]
Спасибо.

More Related Content

What's hot

храпунова
храпуновахрапунова
храпунова
Demanessa
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональному
Agile Base Camp
 
Функция y = x^2 и её график
Функция y = x^2 и её графикФункция y = x^2 и её график
Функция y = x^2 и её график
Formula.co.ua
 
информатика+математика 8 класс
информатика+математика 8 классинформатика+математика 8 класс
информатика+математика 8 класс
Светлана Сырцова
 

What's hot (20)

Простейшие преобразования графиков функций.
Простейшие преобразования графиков функций.Простейшие преобразования графиков функций.
Простейшие преобразования графиков функций.
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
 
3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваивания3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваивания
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
2.6 Динамическая память
2.6 Динамическая память2.6 Динамическая память
2.6 Динамическая память
 
храпунова
храпуновахрапунова
храпунова
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональному
 
Kak postroit grafik_funkcii_y_f_l_m_iz_grafika_fun
Kak postroit grafik_funkcii_y_f_l_m_iz_grafika_funKak postroit grafik_funkcii_y_f_l_m_iz_grafika_fun
Kak postroit grafik_funkcii_y_f_l_m_iz_grafika_fun
 
Простые типы данных
Простые типы данныхПростые типы данных
Простые типы данных
 
Структурное обучение и S-SVM
Структурное обучение и S-SVMСтруктурное обучение и S-SVM
Структурное обучение и S-SVM
 
Linejnaya funkciya
Linejnaya funkciyaLinejnaya funkciya
Linejnaya funkciya
 
Функция y = x^2 и её график
Функция y = x^2 и её графикФункция y = x^2 и её график
Функция y = x^2 и её график
 
Лекция №5 "Обработка текстов, Naive Bayes"
Лекция №5 "Обработка текстов, Naive Bayes" Лекция №5 "Обработка текстов, Naive Bayes"
Лекция №5 "Обработка текстов, Naive Bayes"
 
эскизирование графиков
эскизирование графиковэскизирование графиков
эскизирование графиков
 
Лекция №1 "Задачи Data Mining"
Лекция №1 "Задачи Data Mining" Лекция №1 "Задачи Data Mining"
Лекция №1 "Задачи Data Mining"
 
Linejnaya funkciya i_ee_grafik
Linejnaya funkciya i_ee_grafikLinejnaya funkciya i_ee_grafik
Linejnaya funkciya i_ee_grafik
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
 
информатика+математика 8 класс
информатика+математика 8 классинформатика+математика 8 класс
информатика+математика 8 класс
 
05.01.2015. теория график функции у=х 2
05.01.2015. теория   график функции у=х 205.01.2015. теория   график функции у=х 2
05.01.2015. теория график функции у=х 2
 
L3: Линейная и логистическая регрессия
L3: Линейная и логистическая регрессияL3: Линейная и логистическая регрессия
L3: Линейная и логистическая регрессия
 

Similar to Алгебраические типы данных

Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
Technopark
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
Computer Science Club
 
0. основы r
0. основы r0. основы r
0. основы r
msuteam
 

Similar to Алгебраические типы данных (20)

Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Scala #3
Scala #3Scala #3
Scala #3
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Scala
ScalaScala
Scala
 
Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
лекция 3
лекция 3лекция 3
лекция 3
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
лекция 3
лекция 3лекция 3
лекция 3
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
 
0. основы r
0. основы r0. основы r
0. основы r
 

Алгебраические типы данных