Функциональное программирование - Александр Алексеев

136
Функциональное программирование Александр Алексеев

Upload: aleksander-alekseev

Post on 11-Feb-2017

125 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Функциональное программирование - Александр Алексеев

Функциональноепрограммирование

Александр Алексеев

Page 2: Функциональное программирование - Александр Алексеев

Парадигмыпрограммирования

Page 3: Функциональное программирование - Александр Алексеев

– Процедурное программирование– Объектно-ориентированное программирование– Функциональное программирование– Логическое программирование– и другие...

Page 4: Функциональное программирование - Александр Алексеев

Процедурноепрограммирование

Page 5: Функциональное программирование - Александр Алексеев
Page 6: Функциональное программирование - Александр Алексеев

– Pascal– Си– и другие...

Языки процедурного программирования:

Page 7: Функциональное программирование - Александр Алексеев

Объектно-ориентированное

программирование

Page 8: Функциональное программирование - Александр Алексеев
Page 9: Функциональное программирование - Александр Алексеев

– Java– C#– Delphi (Object Pascal)– C++– Python– Perl, Perl 6– PHP5– и многие другие

ООП-языки:

Page 10: Функциональное программирование - Александр Алексеев

Функциональноепрограммирование

Функциональноепрограммирование

Page 11: Функциональное программирование - Александр Алексеев

Функциональноепрограммирование

Все очень просто!

Page 12: Функциональное программирование - Александр Алексеев
Page 13: Функциональное программирование - Александр Алексеев

Основы(на примере Haskell)

Page 14: Функциональное программирование - Александр Алексеев

data Bool = True | False

Page 15: Функциональное программирование - Александр Алексеев

data Bool = True | False

positive :: Int → Boolpositive x = x > 0

Page 16: Функциональное программирование - Александр Алексеев

data Bool = True | False

positive :: Int → Boolpositive x = x > 0

max :: (Ord a) => a → a → amax x y | x > y = x | otherwise = y

Page 17: Функциональное программирование - Александр Алексеев

data Person = Person { firstName :: String, lastName :: String, birthYear :: Int } deriving (Show)

Page 18: Функциональное программирование - Александр Алексеев

data Person = Person { firstName :: String, lastName :: String, birthYear :: Int } deriving (Show)

alex = Person { firstName = "Александр", lastName = "Алексеев", birthYear = 1988 }

Page 19: Функциональное программирование - Александр Алексеев

class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)

Page 20: Функциональное программирование - Александр Алексеев

class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)

instance Eq Person where x == y = birthYear x == birthYear y

Page 21: Функциональное программирование - Александр Алексеев

class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)

instance Eq Person where x == y = birthYear x == birthYear y x /= y = not (x == y)

Page 22: Функциональное программирование - Александр Алексеев

anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }

Page 23: Функциональное программирование - Александр Алексеев

anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }

alex == anton False

Page 24: Функциональное программирование - Александр Алексеев

anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }

alex == anton Falsealex == alex True

Page 25: Функциональное программирование - Александр Алексеев

anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }

alex == anton Falsealex == alex Trueanton == alex False

Page 26: Функциональное программирование - Александр Алексеев

anton = Person { firstName = "Антон", lastName = "Алексеев", birthYear = 1991 }

alex == anton Falsealex == alex Trueanton == alex Falseanton /= alex True

Page 27: Функциональное программирование - Александр Алексеев

instance Ord Person where compare x y = compare (birthYear y) (birthYear x)

Page 28: Функциональное программирование - Александр Алексеев

instance Ord Person where compare x y = compare (birthYear y) (birthYear x)

instance Ord Person where x `compare` y = birthYear y `compare` birthYear x

Page 29: Функциональное программирование - Александр Алексеев

instance Ord Person where compare x y = compare (birthYear y) (birthYear x)

instance Ord Person where x `compare` y = birthYear y `compare` birthYear x

max :: (Ord a) => a → a → a

Page 30: Функциональное программирование - Александр Алексеев

instance Ord Person where compare x y = compare (birthYear y) (birthYear x)

instance Ord Person where x `compare` y = birthYear y `compare` birthYear x

max :: (Ord a) => a → a → a

max alex anton

Page 31: Функциональное программирование - Александр Алексеев

instance Ord Person where compare x y = compare (birthYear y) (birthYear x)

instance Ord Person where x `compare` y = birthYear y `compare` birthYear x

max :: (Ord a) => a → a → a

max alex anton

birthYear (max alex anton) == 1988

Page 32: Функциональное программирование - Александр Алексеев

Каррирование(англ. currying)

Page 33: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → a

Page 34: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)

Page 35: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)

max' = max alex

Page 36: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)

max' = max alexmax' :: Person → Person

Page 37: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)

max' = max alexmax' :: Person → Person

max' anton :: Person

Page 38: Функциональное программирование - Александр Алексеев

max :: (Ord a) => a → a → amax :: (Ord a) => a → (a → a)

max' = max alexmax' :: Person → Person

max' anton :: PersonbirthYear (max' anton) == 1988

Page 39: Функциональное программирование - Александр Алексеев

Лямбда-функции

Page 40: Функциональное программирование - Александр Алексеев

Лямбда-функции

(λ)

Page 41: Функциональное программирование - Александр Алексеев
Page 42: Функциональное программирование - Александр Алексеев

(\x y → x + y)

Page 43: Функциональное программирование - Александр Алексеев

(\x y → x + y)(\x y → x + y) :: ?

Page 44: Функциональное программирование - Александр Алексеев

(\x y → x + y)(\x y → x + y) :: Num a => a → a → a

Page 45: Функциональное программирование - Александр Алексеев

(\x y → x + y)(\x y → x + y) :: Num a => a → a → a

(\x y → x + y) 3 4

Page 46: Функциональное программирование - Александр Алексеев

(\x y → x + y)(\x y → x + y) :: Num a => a → a → a

(\x y → x + y) 3 4(\x y → x + y) 3 4 == 7

Page 47: Функциональное программирование - Александр Алексеев

Кортежи

Page 48: Функциональное программирование - Александр Алексеев

(1, 2)

Page 49: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')

Page 50: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)

Page 51: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')

Page 52: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')

Page 53: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )

Page 54: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)

Page 55: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)

fst (1, 2) == 1

Page 56: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)

fst (1, 2) == 1snd (1, 2) == 2

Page 57: Функциональное программирование - Александр Алексеев

(1, 2)('a', 'b')(1, 2, 3, 4)(1, 'a')('a')( )(1, (2, 'a'), 3)

fst (1, 2) == 1snd (1, 2) == 2snd (1, (2, 'a'), 3) == (2, 'a')

Page 58: Функциональное программирование - Александр Алексеев

Списки

Page 59: Функциональное программирование - Александр Алексеев

[1, 2, 3]['a', 'b', 'c'][ ][ [1, 2], [3, 4] ][ (1, 'a'), (2, 'b'), (3, 'c') ]

head :: [a] → ahead [4, 8, 15, 16, 23, 42] == 4

tail :: [a] → [a]tail [4, 8, 15, 16, 23, 42] == [8, 15, 16, 23, 42]

Page 60: Функциональное программирование - Александр Алексеев

head :: [a] → ahead [4, 8, 15, 16, 23, 42] == 4

tail :: [a] → [a]tail [4, 8, 15, 16, 23, 42] == [8, 15, 16, 23, 42]

init :: [a] → [a]init [4, 8, 15, 16, 23, 42] == [4, 8, 15, 16, 23]

last :: [a] → alast [4, 8, 15, 16, 23, 42] == 42

Page 61: Функциональное программирование - Александр Алексеев

length :: [a] → Intlength [4, 8, 15, 16, 23, 42] == 6

null :: [a] → Boolnull [ ] == True null [1, 2, 3] == False

reverse [1, 2, 3] == [3, 2, 1]take 3 [1, 2, 3, 4, 5] == [1, 2, 3]drop 3 [1, 2, 3, 4, 5] == [4, 5]sum [1, 2, 3, 4, 5] == 15[1, 2, 3] ++ [4, 5] == [1, 2, 3, 4, 5]

Page 62: Функциональное программирование - Александр Алексеев

Генераторысписков,

интервалы,ленивые вычисления

Page 63: Функциональное программирование - Александр Алексеев

[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]

Page 64: Функциональное программирование - Александр Алексеев

[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]

[1..5] == [1, 2, 3, 4, 5][2,4..10] == [2, 4, 6, 8, 10][1..] == [1, 2, 3, 4, 5, 6, 7, 8, 9, …]take 3 [1..] == [1, 2, 3]

Page 65: Функциональное программирование - Александр Алексеев

[ x * 2 | x ← [1, 2, 3] ] == [2, 4, 6]pairs = [ (x, y) | x ← [1, 2], y ← ['a', 'b'] ]pairs == [ (1,'a'), (1,'b'), (2,'a'), (2,'b') ]

[1..5] == [1, 2, 3, 4, 5][2,4..10] == [2, 4, 6, 8, 10][1..] == [1, 2, 3, 4, 5, 6, 7, 8, 9, …]take 3 [1..] == [1, 2, 3]

cycle [1, 2, 3] == [1, 2, 3, 1, 2, 3, 1, 2, 3, … ]take 5 $ cycle [1, 2, 3] == [1, 2, 3, 1, 2]

Page 66: Функциональное программирование - Александр Алексеев

Функциивысшего порядка

Page 67: Функциональное программирование - Александр Алексеев
Page 68: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]

Page 69: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

Page 70: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]

Page 71: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]map (\x → x + 5) [1,2,3] == [6,7,8]

Page 72: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]

Page 73: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]

foldl :: (a -> b -> a) -> a -> [b] -> a

Page 74: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]

foldl :: (a -> b -> a) -> a -> [b] -> afoldl (\s x -> x + s) 0 [1, 2, 3] == 6

Page 75: Функциональное программирование - Александр Алексеев

filter :: (a -> Bool) -> [a] -> [a]filter (\x -> x `mod` 2 == 0) [1..10] == [2, 4, 8, 10]

map :: (a -> b) -> [a] -> [b]map (+5) [1,2,3] == [6,7,8]

foldl :: (a -> b -> a) -> a -> [b] -> afoldl (\s x -> x + s) 0 [1, 2, 3] == 6

sum = foldl (\s x -> x + s) 0

Page 76: Функциональное программирование - Александр Алексеев

Пишемсобственные

функции

Page 77: Функциональное программирование - Александр Алексеев

null' :: [a] → Bool

Page 78: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = True

Page 79: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = Truenull' _ = False

Page 80: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = Truenull' _ = False

head' :: [a] → a

Page 81: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = Truenull' _ = False

head' :: [a] → ahead' (x:xs) = x

Page 82: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = Truenull' _ = False

head' :: [a] → ahead' (x:xs) = xhead' _ = error 'Empty list!'

Page 83: Функциональное программирование - Александр Алексеев

null' :: [a] → Boolnull' [ ] = Truenull' _ = False

head' :: [a] → ahead' (x:xs) = xhead' _ = error 'Empty list!'

[1, 2, 3] == (1:(2:(3:[])))

Page 84: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> a

Page 85: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xs

Page 86: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

Page 87: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Bool

Page 88: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | ...

Page 89: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yx

Page 90: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False

Page 91: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False

elem' 1 [1, 2, 3] == True

Page 92: Функциональное программирование - Александр Алексеев

foldl' :: (a -> b -> a) -> a -> [b] -> afoldl' func acc (x:xs) = foldl' func (func acc x) xsfoldl' _ acc _ = acc

elem' :: Eq a => a -> [a] -> Boolelem' x (y:yx) | x == y = True | otherwise = elem' x yxelem' _ _ = False

elem' 1 [1, 2, 3] == True elem' 7 [1, 2, 3] == False

Page 93: Функциональное программирование - Александр Алексеев

За кадром остались:

Page 94: Функциональное программирование - Александр Алексеев

За кадром остались:– параметризованные типы

Page 95: Функциональное программирование - Александр Алексеев

За кадром остались:– параметризованные типы– монады

Page 96: Функциональное программирование - Александр Алексеев

За кадром остались:– параметризованные типы– монады– ввод/вывод

Page 97: Функциональное программирование - Александр Алексеев

За кадром остались:– параметризованные типы– монады– ввод/вывод– аппликативные функторы

Page 98: Функциональное программирование - Александр Алексеев

За кадром остались:– параметризованные типы– монады– ввод/вывод– аппликативные функторы– застежки

Page 99: Функциональное программирование - Александр Алексеев

Зачем все это нужно:

Page 100: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность

Page 101: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью

Page 102: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов

Page 103: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание

Page 104: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание– Строгая типизация

Page 105: Функциональное программирование - Александр Алексеев

Зачем все это нужно:– Настоящая кроссплатформенность– Автоматическое управление памятью– Отсутсвие побочных эффектов– Автоматическое распараллеливание– Строгая типизация– и не только

Page 106: Функциональное программирование - Александр Алексеев

Насколько быстр Haskell?

Page 107: Функциональное программирование - Александр Алексеев

Насколько быстр Haskell?

Page 108: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?

Page 109: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)

Page 110: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)

Page 111: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)

Page 112: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)

Page 113: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)– модули ядра Linux

Page 114: Функциональное программирование - Александр Алексеев

Что можно написать на Haskell?– CLI-приложения (например, Darcs)– GUI-приложения (wxHaskell, gtk2hs, etc)– веб-приложения (Yesod, Happstack, etc)– компиляторы, парсеры (Alex, Happy)– модули ядра Linux– и многое другое

Page 115: Функциональное программирование - Александр Алексеев

Другие ФП-языки:

Page 116: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang

Page 117: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml

Page 118: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml– Standart ML

Page 119: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp

Page 120: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket

Page 121: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket– Clojure

Page 122: Функциональное программирование - Александр Алексеев

Другие ФП-языки:– Erlang– OCaml– Standart ML– Common Lisp– Scheme, Racket– Clojure– и другие

Page 123: Функциональное программирование - Александр Алексеев

Литературапо ФП

Page 124: Функциональное программирование - Александр Алексеев
Page 125: Функциональное программирование - Александр Алексеев
Page 126: Функциональное программирование - Александр Алексеев
Page 127: Функциональное программирование - Александр Алексеев

Подборка ссылок:

Page 128: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/

Page 129: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/

Page 130: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/

Page 131: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian

Page 132: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian

Page 133: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian

Page 134: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian– http://habrahabr.ru/hub/haskell

Page 135: Функциональное программирование - Александр Алексеев

Подборка ссылок:– http://fprog.ru/planet/– http://erlanger.ru/– http://it-talk.org/– http://groups.google.ru/group/haskell-russian– http://groups.google.ru/group/erlang-russian– http://groups.google.ru/group/clojure-russian– http://habrahabr.ru/hub/haskell– http://goo.gl/VUvjk (эта презентация)

Page 136: Функциональное программирование - Александр Алексеев

Спасибо за внимание!

Александр Алексеев

http://eax.me/