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

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

Embed Size (px)

DESCRIPTION

Введение в типы данных используемые в языках Haskell, ML, SML, Ocaml, F#. Какие типы используются, как они создаются и зачем нужны. Не требуется никакого знания ни одного из перечисленных языков.

Citation preview

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

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

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

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

- типы получаемые из других типов с помощью алгебраических операций

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

Простые типы

● Int

● Double

● Bool

● Char

● String

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

Функции с 1 аргументом

incr x = x + 1

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

Функции с 1 аргументом

incr x = x + 1

fact 0 = 1

fact n = fact (n-1) * n

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

Функции с 2 аргументами

add (x, y) = x + y

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

Функции с 2 аргументами

add (x, y) = x + y

mul (0, _) = 0

mul (1, x) = x

mul (n, x) = mul (n-1, x) + x

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

Типы функций

incr :: Int -> Int

fact :: Int -> Int

add :: (Int, Int) -> Int

mul :: (Int, Int) -> Int

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

Горькая правда о парах

mul :: (Int, Int) -> Int

mul (n, x) = n * x

mul pair = (fst pair) * (snd pair)

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

Что такое пара?

● Просто два значения собранные вместе.

● Множество пар – декартово произведение множеств.

● Пара – составной тип.

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

Как же сделать функцию нескольких аргументов?

● Никак.

● Эмулировать с помощью пар.

● Эмулировать с помощью каррирования.

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

Лямбды

incr x = x + 1

incr = \x -> x + 1

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

Лямбды

incr x = x + 1

incr = \x -> x + 1

incr 10 -- 11

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

Лямбды и каррирование

add = (\x -> (\y -> x + y))

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

Лямбды и каррирование

add = (\x -> (\y -> x + y))

add x = (\y -> x + y)

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

Лямбды и каррирование

add = (\x -> (\y -> x + y))

add x = (\y -> x + y)

add x y = x + y

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

Каррирование

add x y = x + y

add 3 4 -- 7

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

Каррирование

add x y = x + y

add 3 4 -- 7

(add 3) 4 -- 7

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

Тип каррированной функции

add :: Int -> (Int -> Int)

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

Тип каррированной функции

add :: Int -> (Int -> Int)

add :: Int -> Int -> Int

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

Тип каррированной функции

add :: Int -> (Int -> Int)

add :: Int -> Int -> Int

-- не то же самое:

add :: (Int -> Int) -> Int

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

Частичное применение

add10 = add 10

add10 3 -- 13

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

Частичное применение

add10 = add 10

add10 3 -- 13

map (add 5) [1,2,3]

-- [6,7,8]

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

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

● Типы произведения.

● Типы суммы.

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

Тип-произведение

– имеет по значению для каждого из своих компонентов

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

Тип-произведение

– декартово произведение своих составляющих

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

Тип-произведение

● Кортежи● Записи● struct в c● Объекты

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

Кортежи

(1, 2, 3) :: (Int, Int, Int)

('x', 'a') :: (Char, Char)

('x', 42) :: (Char, Int)

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

Кортежи

(incr, mul) :: (Int -> Int, (Int, Int) -> Int)

(1,(2,3)) :: (Int,(Int,Int))

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

Записи

data Point = Point Int Int

data Person

= Person {name :: String, age :: Int}

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

Записи

Point 10 20

Person {name = "Alice", age = 25}

Person {age = 25, name = "Alice"}

Person "Alice" 25

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

Конструкторы записей

Person :: String -> Int -> Person

(Person "Alice") :: Int -> Person

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

Конструкторы записей

Person :: String -> Int -> Person

(Person "Alice") :: Int -> Person

map (Person "Alice") [10, 20, 30]

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

Конструкторы записей

lame (Person n a) = n ++ " is "

++ (show a) ++ " years old"

lame p = (name p) ++ " is "

++ (show (age p)) ++ " years old"

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

Тип-сумма

– имеет значение одного из своих компонентов за раз

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

Тип-сумма

– объединение множеств своих составляющих

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

Тип-сумма

● union в c● variant● динамические типы

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

Объединения

data Value = Exact Double

| Range Double Double

data Gender = Male | Female

data Person = Person String Gender

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

Объединения

valueLen (Exact _) = 0

valueLen (Range x y) = y - x

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

Объединения

data NamedVal = NamedVal String Value

f (NamedValue s v) = ...

f (NamedValue s (Exact x)) = ...

f (NamedValue s (Range x y)) = ...

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

Полиморфизм функций

add :: (Int, Int) -> Int

add :: (Double, Double) -> Double

...

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

Полиморфизм функций

identity x = x

identity :: a -> a

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

Полиморфизм функций

identity x = x

identity :: a -> a

flip (x, y) = (y, x)

flip :: (a, b) -> (b, a)

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

Полиморфизм типов

data Maybe a = Nothing | Just a

data Either a b = Left a | Right b

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

Полиморфизм типов

justP (x, y) = (Just x, Just y)

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

Полиморфизм типов

justP (x, y) = (Just x, Just y)

justP :: (a, b) -> (Maybe a, Maybe b)

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

Полиморфные рекурсивные типы

data List a = Empty | Cons a (List a)

Empty

Cons 1 Empty

Cons 1 (Cons 2 Empty)

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

Полиморфные рекурсивные типы

data List a = Empty | Cons a (List a)

Cons "1" (Cons "2" Empty)

-- не сработает:

Cons "1" (Cons 2 Empty)

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

Полиморфные рекурсивные типы

len Empty = 0

len (Cons _ tail) = 1 + len tail

len :: List a -> Int

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

Настоящие списки

data [a] = [] | a : [a]

length [] = 0

length x:xs = 1 + length xs

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

Настоящие списки

data [a] = [] | a : [a]

type String = [Char]

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

Спасибо.