25
Боремся со сложностью по-функциональному Роман Чепляка 28 января 2012 AgileBaseCamp

Боремся со сложностью по-функциональному

Embed Size (px)

Citation preview

Page 1: Боремся со сложностью по-функциональному

Боремся со сложностьюпо-функциональному

Роман Чепляка

28 января 2012AgileBaseCamp

Page 2: Боремся со сложностью по-функциональному

Борьба со сложностью

повторное использование кодакомбинируемостьDRY

Page 3: Боремся со сложностью по-функциональному

Функциональный

Page 4: Боремся со сложностью по-функциональному

Функциональный

Функции высшего порядкаfilter :: (a -> Bool) -> [a] -> [a]

λ-функцииfilteredList :: [Int]filteredList = filter (\x -> x > 5) [1..10]

Page 5: Боремся со сложностью по-функциональному

Функциональный

Функции высшего порядкаfilter :: (a -> Bool) -> [a] -> [a]

λ-функцииfilteredList :: [Int]filteredList = filter (\x -> x > 5) [1..10]

Page 6: Боремся со сложностью по-функциональному

Итерация

Задача: вычислить сумму элементов коллекцииint s = 0;for ( iter = a.begin(); iter != a.end(); iter++ ){

s += *iter;}

Page 7: Боремся со сложностью по-функциональному

Итерация

fold :: (s -> a -> s) -> s -> [a] -> s

sum list = fold (\s a -> s + a) 0 list

prod list = fold (\s a -> s * a) 1 list

size list = fold (\s a -> s + 1) 0 list

Page 8: Боремся со сложностью по-функциональному

Итерация

fold :: (s -> a -> s) -> s -> [a] -> s

sum list = fold (\s a -> s + a) 0 list

prod list = fold (\s a -> s * a) 1 list

size list = fold (\s a -> s + 1) 0 list

Page 9: Боремся со сложностью по-функциональному

Итерация

fold :: (s -> a -> s) -> s -> [a] -> s

sum list = fold (\s a -> s + a) 0 list

prod list = fold (\s a -> s * a) 1 list

size list = fold (\s a -> s + 1) 0 list

Page 10: Боремся со сложностью по-функциональному

Итерация

fold :: (s -> a -> s) -> s -> [a] -> s

sum list = fold (\s a -> s + a) 0 list

prod list = fold (\s a -> s * a) 1 list

size list = fold (\s a -> s + 1) 0 list

Page 11: Боремся со сложностью по-функциональному

Maybe

data Maybe a = Nothing | Just a

foo =case bar of

Just n -> nNothing -> 0

Page 12: Боремся со сложностью по-функциональному

Maybe

data Maybe a = Nothing | Just a

foo =case bar of

Just n -> nNothing -> 0

Page 13: Боремся со сложностью по-функциональному

Maybe

fromMaybe :: a -> Maybe a -> afromMaybe d m =

case m ofJust n -> nNothing -> d

Page 14: Боремся со сложностью по-функциональному

Maybe

foo =case bar of

Just n -> nNothing -> factorial 1000000

Page 15: Боремся со сложностью по-функциональному

Maybe

foo = fromMaybe (factorial 1000000) bar

Page 16: Боремся со сложностью по-функциональному

Ленивый

Page 17: Боремся со сложностью по-функциональному

Ленивый

Функция вычисляет свой аргумент только

если он нужен

в той степени, в которой он нужен

Page 18: Боремся со сложностью по-функциональному

Ленивый

Функция вычисляет свой аргумент только

если он нужен

в той степени, в которой он нужен

Page 19: Боремся со сложностью по-функциональному

Повторное использование кода

lotteryTickets :: Statistics -> [Ticket]

myTickets = take 10 (lotteryTickets stats)

Page 20: Боремся со сложностью по-функциональному

Повторное использование кода

lotteryTickets :: Statistics -> [Ticket]

myTickets = take 10 (lotteryTickets stats)

Page 21: Боремся со сложностью по-функциональному

Чистый

Page 22: Боремся со сложностью по-функциональному

Чистый

Упрощает комбинирование функций

Page 23: Боремся со сложностью по-функциональному

Чистый

Упрощает тестирование функцийprop :: [Int] -> Boolprop list = isSorted (mySort list)

> quickCheck prop+++ OK, passed 100 tests.

Page 24: Боремся со сложностью по-функциональному

Чистый

Упрощает тестирование функцийprop :: [Int] -> Boolprop list = isSorted (mySort list)

> quickCheck prop+++ OK, passed 100 tests.

Page 25: Боремся со сложностью по-функциональному

Итоги

Функции помогают структурировать программыЛенивость снижает стоимость комбинирования

функцийЧистота делает код модульным и упрощает

тестирование