Презентация Домашнее задание. Findmajor, alldifflists, findinlists. Continuations (продолжения). Continuation-passing style (cps) онлайн
Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
29 слайдов
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
813.00 kB
Просмотров:
53
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд![Д.з.](/documents_6/c819d3faca5998e3d006562b254f6b95/img0.jpg)
№2 слайд![findMajor Найти число больше](/documents_6/c819d3faca5998e3d006562b254f6b95/img1.jpg)
Содержание слайда: findMajor
Найти число больше суммы всех остальных
Идея: можно сначала сосчитать сумму s всех чисел
Тогда условие: x > s – x
C помощью maximum
findMajor xs = let s = sum xs
x = maximum xs
in if x > s - x then Just x else Nothing
Не работает для пустого списка
С помощью filter
findMajor xs = let s = sum xs
xs1 = filter (\x -> x > s - x) xs
in if xs1 == [] then Nothing else Just (head xs1)
№3 слайд![findMajor - продожение](/documents_6/c819d3faca5998e3d006562b254f6b95/img2.jpg)
Содержание слайда: findMajor - продожение
Написать специальный find
find cond [] = Nothing
find cond (x:xs) =
if cond x
then Just x
else find cond xs
(На самом деле именно это и делает стандартный find в Data.List, т.е. его и писать не надо)
findMajor xs = let
s = sum xs
in find (\x -> x > s - x) xs
№4 слайд![allDiffLists allDiffLists n k](/documents_6/c819d3faca5998e3d006562b254f6b95/img3.jpg)
Содержание слайда: allDiffLists
allDiffLists n k = allDiffLists' n k []
allDiffLists' n k s (s – те элементы, которые мы уже включили)
allDiffLists' n 0 _ = [[]]
allDiffLists' n k s = [x:xs | x<-[1..n], not (elem x s),
allDiffLists' n k (x:s)]
То же с приемом "представление множества с помощью функции"
allDiffLists n k = allDiffLists' n k (\t -> False)
allDiffLists' n k cond (cond – условие, которое мы проверяем)
allDiffLists' n 0 _ = [[]]
allDiffLists' n k cond = [x:xs | x<-[1..n], not (cond x),
xs <- allDiffLists' n (k-1)
(\t -> cond t || t == x)]
№5 слайд![findInLists Без failure](/documents_6/c819d3faca5998e3d006562b254f6b95/img4.jpg)
Содержание слайда: findInLists
Без failure continuation как-то так:
искать в первом подсписке
if нашли
then вернуть то, что нашли
else искать в хвосте
С использованием failure continuation
findInLists cond (xs:xss) err =
find cond xs
(
findInLists cond xss err
)
findInLists cond [] err = err
Обошлись без if!
№6 слайд![Continuations продолжения .](/documents_6/c819d3faca5998e3d006562b254f6b95/img5.jpg)
Содержание слайда: Continuations (продолжения).
Continuation-passing style (CPS)
№7 слайд![Continuation-passing style](/documents_6/c819d3faca5998e3d006562b254f6b95/img6.jpg)
Содержание слайда: Continuation-passing style
Continuation: параметр–функция. Задает, что делать после окончания работы функции
failure continuation – вызываем, если функция завершилась не успешно
Continuation-passing style (CPS) - вызываем всегда!
№8 слайд![Continuation-passing style](/documents_6/c819d3faca5998e3d006562b254f6b95/img7.jpg)
Содержание слайда: Continuation-passing style – простой пример
Обычная функция:
sqr x = x*x
CPS
sqr_cps x f =
f (x*x)
Примеры вызова:
Сосчитать sin(5*5)
sqr_cps 5 sin
Сосчитать 5*5 + 1
sqr_cps 5 (+1)
Сосчитать 5*5
sqr_cps 5 id
№9 слайд![CPS и рекурсия. Пример](/documents_6/c819d3faca5998e3d006562b254f6b95/img8.jpg)
Содержание слайда: CPS и рекурсия.
Пример: факториал
Обычная программа
fact 0 = 1
fact n = fact (n-1) * n
CPS стиль
fact_cps 0 f = f 1
fact_cps n f =
fact_cps (n-1) f1
where
f1 res = f (res *n)
№10 слайд![Как это работает? Обычный](/documents_6/c819d3faca5998e3d006562b254f6b95/img9.jpg)
Содержание слайда: Как это работает?
Обычный fact
fact 4
fact 3
fact 2
fact 1
fact 0 1
* 1
* 2
* 3
* 4
№11 слайд![Чего так можно добиться?](/documents_6/c819d3faca5998e3d006562b254f6b95/img10.jpg)
Содержание слайда: Чего так можно добиться?
Оказывается, к такому виду можно привести любую программу
fact_cps n f = fact_cps (n-1) …
Что можно сказать fact_cps?
Хвостовая рекурсия
Для хвостовой рекурсии не нужен стек
Значит CPS программам вообще не нужен стек!
Чудес не бывает! Куда делся стек?
Стек – это и есть параметр f. Там храниться то, что нам еще надо сделать
№12 слайд![Некоторые применения Можно](/documents_6/c819d3faca5998e3d006562b254f6b95/img11.jpg)
Содержание слайда: Некоторые применения
Можно реализовывать сложную передачу управления
Peter Landin: как программу с goto перевести в функциональную программу?
Вариант при разработке компилятора: автоматически переводить в CPS стиль
Тогда не нужен будет стек
Например, Scheme
Асинхронные вычисления
Выполнить действие A, а потом, когда оно завершиться, выполнить с результатом действие B
Например, .NET Task Parallel Library
http://msdn.microsoft.com/en-us/library/ee372288(v=vs.110).aspx
№13 слайд![Еще про gt gt . gt gt для](/documents_6/c819d3faca5998e3d006562b254f6b95/img12.jpg)
Содержание слайда: Еще про >>=.
>>= для других типов
№14 слайд![Три поиска Найти в списке](/documents_6/c819d3faca5998e3d006562b254f6b95/img13.jpg)
Содержание слайда: Три поиска
Найти в списке:
первое число, меньшее 5
первое число, большее 10
первое число, не равное 7
Вернуть сумму этих чисел, или [], если что-то не нашли
find cond [] = []
find cond (x:xs) =
if cond x
then [x]
else find cond xs
№15 слайд![Выполнять до первой неудачи f](/documents_6/c819d3faca5998e3d006562b254f6b95/img14.jpg)
Содержание слайда: «Выполнять до первой неудачи»
f xs = do
x <- find (<5) xs
y <- find (>10) xs
z <- find (/=7) xs
return (x+y+z)
Если пустой список обозначает неудачу поиска
то do – «выполнять до первой неудачи»
Или можно то же через >>=
f xs = find (<5) xs >>= \x ->
find (>10) xs >>= \y ->
find (/=7) xs >>= \z ->
return (x+y+z)
№16 слайд![do для Maybe gt gt и return](/documents_6/c819d3faca5998e3d006562b254f6b95/img15.jpg)
Содержание слайда: do для Maybe
>> и return (и, следовательно, do) определены и для Maybe
Смысл такой же – «выполнять до первой неудачи»
Например: Найти число, которые больше всех остальных вместе в xs, число которое больше всех остальных в yx и вернуть их произведение. Если не получится, вернуть Nothing.
do
x <- findMajor xs
y <- findMajor ys
return (x*y)
№17 слайд![Что такое монады, формально](/documents_6/c819d3faca5998e3d006562b254f6b95/img16.jpg)
Содержание слайда: Что такое монады, формально
Монада – это тип, для которого определены операции
>>=
return
Строго говоря операции еще должны удовлетворять некоторым правилам (Monadic laws)
return a >>= f ≡ f a
m >>= return ≡ m
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
Уже знаем два примера монад:
List
Maybe
№18 слайд![В каких случаях используют](/documents_6/c819d3faca5998e3d006562b254f6b95/img17.jpg)
Содержание слайда: В каких случаях используют монады?
f xs = do
x <- find (<5) xs
y <- find (>10) xs
z <- find (/=7) xs
return (x+y+z)
Т.е. мы описываем некоторые действия
Которые должны выполняться одно за другим
И при этом должно автоматически происходить что-то дополнительное
Примерно как если бы в обычном языке мы могли бы переопределить точку с запятой
№19 слайд![Функция print print выражение](/documents_6/c819d3faca5998e3d006562b254f6b95/img18.jpg)
Содержание слайда: Функция print
print выражение
print 56
56
Ничего не возвращает, только печатает
Смысл очень понятен
Но непонятно как это сочетается отсуствием побочных эффектов и т.д.
Об этом в следующий раз
№20 слайд![Пример вывод рекурсия pr](/documents_6/c819d3faca5998e3d006562b254f6b95/img19.jpg)
Содержание слайда: Пример: вывод + рекурсия
pr 0 = print 0
pr n = do
print n
pr (n-1)
pr 5
5
4
3
2
1
0
№21 слайд![Задача про gt gt gt и ее](/documents_6/c819d3faca5998e3d006562b254f6b95/img20.jpg)
Содержание слайда: Задача про >>> и ее продолжение
№22 слайд![gt gt gt Что-то вроде](/documents_6/c819d3faca5998e3d006562b254f6b95/img21.jpg)
Содержание слайда: >>>
Что-то вроде композиции, но специально для функций вида
список -> (значение, список)
Пример вызова:
f = find (>3) >>> find (>5)
f >>> g = \xs ->
let
(_, xs1) = f xs
in g xs1
№23 слайд![Недостатки gt gt gt Нужно ли](/documents_6/c819d3faca5998e3d006562b254f6b95/img22.jpg)
Содержание слайда: Недостатки >>>
Нужно ли еще что-то, чтобы гибко комбинировать функции такого вида?
Пример 1:
Найти число большее 3, потом число, больше 5 и вернуть их сумму
Пример 2:
Найти число t, большее 3, а потом найти число, большее t
C помощью >>> не написать…
Д.з.: обобщить >>>, чтобы устранить этот недостаток
Подсказка: я бы предложил ввести функцию >>>=
№24 слайд![Символьные вычисления](/documents_6/c819d3faca5998e3d006562b254f6b95/img23.jpg)
Содержание слайда: Символьные вычисления
№25 слайд![eval data Expr Num Integer X](/documents_6/c819d3faca5998e3d006562b254f6b95/img24.jpg)
Содержание слайда: eval
data Expr = Num Integer | X | Add Expr Expr | Mult Expr Expr
eval выражение значение_для_X
eval (Num i) _ = i
eval X n = n
eval (Add x y) n = eval x n + eval y n
eval (Mult x y) n = eval x n * eval y n
№26 слайд![diff data Expr Num Integer X](/documents_6/c819d3faca5998e3d006562b254f6b95/img25.jpg)
Содержание слайда: diff
data Expr = Num Integer | X | Add Expr Expr | Mult Expr Expr
deriving Show
В Expr обязательно deriving Show
diff (Num _) = Num 0
diff X = Num 1
diff (Add x y) = Add (diff x) (diff y)
diff (Mult x y) = Add (Mult (diff x) y) (Mult (diff y) x)
№27 слайд![Если хотим использовать](/documents_6/c819d3faca5998e3d006562b254f6b95/img26.jpg)
Содержание слайда: Если хотим использовать несколько переменных?
X
Var "a", Var "sum" и т.д.
Add (Mult (Num 10) (Var "a")) (Var "b")
изображает 10*a + b
Какой должен быть параметр у eval?
Список пар (строка, значение)
Например:
eval (Add (Mult (Num 10) (Var "a")) (Var "b"))
[("a", 5), ("b", 7)]
№28 слайд![Про некоторые доп.задачи](/documents_6/c819d3faca5998e3d006562b254f6b95/img27.jpg)
Содержание слайда: Про некоторые доп.задачи
№29 слайд![fromStr toStr Empty e toStr](/documents_6/c819d3faca5998e3d006562b254f6b95/img28.jpg)
Содержание слайда: fromStr
toStr Empty = 'e‘
toStr (Node v l r) = 'n':toStr l ++ toStr r
создать строку дописать строку!
fromStr’ t s – дописать представление t к строке s
toStr’ Empty s = 'e':s
toStr’ (Node v l r) s = let
s1 = toStr’ r s
s2 = tpStr’ l s1
in 'n':s2
Задача на занятии на листке: записать эти правила не используя прямо строки s, s1, s2 – т.е. с помощью операций над функциями