Алгебраические типы данных
DESCRIPTION
Введение в типы данных используемые в языках Haskell, ML, SML, Ocaml, F#. Какие типы используются, как они создаются и зачем нужны. Не требуется никакого знания ни одного из перечисленных языков.TRANSCRIPT
![Page 1: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/1.jpg)
Алгебраические типы данных
![Page 2: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/2.jpg)
Алгебраические типы данных
- типы получаемые из других типов с помощью алгебраических операций
![Page 3: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/3.jpg)
Простые типы
● Int
● Double
● Bool
● Char
● String
![Page 4: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/4.jpg)
Функции с 1 аргументом
incr x = x + 1
![Page 5: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/5.jpg)
Функции с 1 аргументом
incr x = x + 1
fact 0 = 1
fact n = fact (n-1) * n
![Page 6: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/6.jpg)
Функции с 2 аргументами
add (x, y) = x + y
![Page 7: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/7.jpg)
Функции с 2 аргументами
add (x, y) = x + y
mul (0, _) = 0
mul (1, x) = x
mul (n, x) = mul (n-1, x) + x
![Page 8: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/8.jpg)
Типы функций
incr :: Int -> Int
fact :: Int -> Int
add :: (Int, Int) -> Int
mul :: (Int, Int) -> Int
![Page 9: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/9.jpg)
Горькая правда о парах
mul :: (Int, Int) -> Int
mul (n, x) = n * x
mul pair = (fst pair) * (snd pair)
![Page 10: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/10.jpg)
Что такое пара?
● Просто два значения собранные вместе.
● Множество пар – декартово произведение множеств.
● Пара – составной тип.
![Page 11: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/11.jpg)
Как же сделать функцию нескольких аргументов?
● Никак.
● Эмулировать с помощью пар.
● Эмулировать с помощью каррирования.
![Page 12: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/12.jpg)
Лямбды
incr x = x + 1
incr = \x -> x + 1
![Page 13: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/13.jpg)
Лямбды
incr x = x + 1
incr = \x -> x + 1
incr 10 -- 11
![Page 14: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/14.jpg)
Лямбды и каррирование
add = (\x -> (\y -> x + y))
![Page 15: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/15.jpg)
Лямбды и каррирование
add = (\x -> (\y -> x + y))
add x = (\y -> x + y)
![Page 16: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/16.jpg)
Лямбды и каррирование
add = (\x -> (\y -> x + y))
add x = (\y -> x + y)
add x y = x + y
![Page 17: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/17.jpg)
Каррирование
add x y = x + y
add 3 4 -- 7
![Page 18: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/18.jpg)
Каррирование
add x y = x + y
add 3 4 -- 7
(add 3) 4 -- 7
![Page 19: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/19.jpg)
Тип каррированной функции
add :: Int -> (Int -> Int)
![Page 20: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/20.jpg)
Тип каррированной функции
add :: Int -> (Int -> Int)
add :: Int -> Int -> Int
![Page 21: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/21.jpg)
Тип каррированной функции
add :: Int -> (Int -> Int)
add :: Int -> Int -> Int
-- не то же самое:
add :: (Int -> Int) -> Int
![Page 22: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/22.jpg)
Частичное применение
add10 = add 10
add10 3 -- 13
![Page 23: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/23.jpg)
Частичное применение
add10 = add 10
add10 3 -- 13
map (add 5) [1,2,3]
-- [6,7,8]
![Page 24: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/24.jpg)
Алгебраические типы данных
● Типы произведения.
● Типы суммы.
![Page 25: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/25.jpg)
Тип-произведение
– имеет по значению для каждого из своих компонентов
![Page 26: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/26.jpg)
Тип-произведение
– декартово произведение своих составляющих
![Page 27: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/27.jpg)
Тип-произведение
● Кортежи● Записи● struct в c● Объекты
![Page 28: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/28.jpg)
Кортежи
(1, 2, 3) :: (Int, Int, Int)
('x', 'a') :: (Char, Char)
('x', 42) :: (Char, Int)
![Page 29: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/29.jpg)
Кортежи
(incr, mul) :: (Int -> Int, (Int, Int) -> Int)
(1,(2,3)) :: (Int,(Int,Int))
![Page 30: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/30.jpg)
Записи
data Point = Point Int Int
data Person
= Person {name :: String, age :: Int}
![Page 31: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/31.jpg)
Записи
Point 10 20
Person {name = "Alice", age = 25}
Person {age = 25, name = "Alice"}
Person "Alice" 25
![Page 32: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/32.jpg)
Конструкторы записей
Person :: String -> Int -> Person
(Person "Alice") :: Int -> Person
![Page 33: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/33.jpg)
Конструкторы записей
Person :: String -> Int -> Person
(Person "Alice") :: Int -> Person
map (Person "Alice") [10, 20, 30]
![Page 34: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/34.jpg)
Конструкторы записей
lame (Person n a) = n ++ " is "
++ (show a) ++ " years old"
lame p = (name p) ++ " is "
++ (show (age p)) ++ " years old"
![Page 35: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/35.jpg)
Тип-сумма
– имеет значение одного из своих компонентов за раз
![Page 36: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/36.jpg)
Тип-сумма
– объединение множеств своих составляющих
![Page 37: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/37.jpg)
Тип-сумма
● union в c● variant● динамические типы
![Page 38: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/38.jpg)
Объединения
data Value = Exact Double
| Range Double Double
data Gender = Male | Female
data Person = Person String Gender
![Page 39: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/39.jpg)
Объединения
valueLen (Exact _) = 0
valueLen (Range x y) = y - x
![Page 40: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/40.jpg)
Объединения
data NamedVal = NamedVal String Value
f (NamedValue s v) = ...
f (NamedValue s (Exact x)) = ...
f (NamedValue s (Range x y)) = ...
![Page 41: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/41.jpg)
Полиморфизм функций
add :: (Int, Int) -> Int
add :: (Double, Double) -> Double
...
![Page 42: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/42.jpg)
Полиморфизм функций
identity x = x
identity :: a -> a
![Page 43: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/43.jpg)
Полиморфизм функций
identity x = x
identity :: a -> a
flip (x, y) = (y, x)
flip :: (a, b) -> (b, a)
![Page 44: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/44.jpg)
Полиморфизм типов
data Maybe a = Nothing | Just a
data Either a b = Left a | Right b
![Page 45: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/45.jpg)
Полиморфизм типов
justP (x, y) = (Just x, Just y)
![Page 46: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/46.jpg)
Полиморфизм типов
justP (x, y) = (Just x, Just y)
justP :: (a, b) -> (Maybe a, Maybe b)
![Page 47: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/47.jpg)
Полиморфные рекурсивные типы
data List a = Empty | Cons a (List a)
Empty
Cons 1 Empty
Cons 1 (Cons 2 Empty)
![Page 48: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/48.jpg)
Полиморфные рекурсивные типы
data List a = Empty | Cons a (List a)
Cons "1" (Cons "2" Empty)
-- не сработает:
Cons "1" (Cons 2 Empty)
![Page 49: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/49.jpg)
Полиморфные рекурсивные типы
len Empty = 0
len (Cons _ tail) = 1 + len tail
len :: List a -> Int
![Page 50: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/50.jpg)
Настоящие списки
data [a] = [] | a : [a]
length [] = 0
length x:xs = 1 + length xs
![Page 51: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/51.jpg)
Настоящие списки
data [a] = [] | a : [a]
type String = [Char]
![Page 52: Алгебраические типы данных](https://reader030.vdocuments.site/reader030/viewer/2022020207/559c1ddb1a28abd3298b4624/html5/thumbnails/52.jpg)
Спасибо.