-

Подобни документи
Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

C++

4

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

Информатика

(не)разложимост на полиноми с рационални коефициенти Велико Дончев Допълнителен материал за студентите по Висша алгебра и Алгебра 2 на ФМИ 1 Предварит

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Microsoft Word - VM22 SEC55.doc

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Microsoft Word - PRMAT sec99.doc

1. Инструментални средства на изкуствения интелект. Основната характеристика на програмните системи, базирани на знания, отличаваща ги от стандартните

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Lush Green

Семинар 1: Комплексни числа. Функции на комплексна променлива.

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и

Homework 2

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Виртуални функции

ЛЕКЦИЯ 6 ЗАКОН ЗА ИНЕРЦИЯТА Определение. Броят на положителните коефициенти в каноничния вид на дадена квадратична форма се нарича положителен индекс

Lush Green

Microsoft Word - VM22 SEC66.doc

Глава 15 Въпрос 15: Оператор на Рейнолдс. Крайна породеност на пръстена от инвариантни полиноми на крайна матрична група. Навсякъде в настоящия въпрос

Microsoft Word - PMS sec1212.doc

СОФИЙСКА МАТЕМАТИЧЕСКА ГИМНАЗИЯ ТУРНИР ПО МАТЕМАТИКА И ИНФОРМАТИКА "ЗА ТОРТАТА НА ДИРЕКТОРА" ТЕМА ПО МАТЕМАТИКА 8 КЛАС Задача 1. Да се реши в цели чис

16. Основни методи за интегриране. Интегриране на някои класове функции Интегриране по части. Теорема 1 (Формула за интегриране по части). Ако

Глава 3 Едномерни стационарни задачи 3.1 Едномерна безкрайна правоъгълна потенциална яма В тази глава ще разгледаме най-простия едномерен потенциал: б

Семинар № 2: Граници на редици, признаци на Даламбер и Коши за сходимост на редове

Проф

Програмиране на Паскал

Частично рекурсивни, рекурсивни и примитивно рекурсивни функции. Рекурсивни и рекурсивно номеруеми множества Този текст съдържа някои сведения от теор

Microsoft Word - Sem02_KH_VM2-19.doc

Microsoft Word - nbb2.docx

5

Microsoft Word - VM-2-7-integrirane-na-racionalni-funkcii-seminar.doc

Black and White

Microsoft Word - IGM-SER1111.doc

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1

Глава 17 ζ-функция на Hasse-Weil. Преди да разгледаме ζ-функцията на Hasse-Weil трябва да въведем някои числови инварианти на крива, определена над кр

Microsoft Word - Lecture 14-Laplace Transform-N.doc

Slide 1

Препис:

Лениво оценяване и програмиране от по-висок ред Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 7 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 1 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 g(f (4)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 g(f (4)) (f (4)) 2 + f (4) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! 24 2 + 24 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! 24 2 + 24 600 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 оценява се отвътре навън g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! 24 2 + 24 600 оценява се отвън навътре Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) 24 2 + 24 600 оценява се отвътре навън стриктно (апликативно, лакомо) оценяване g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! 24 2 + 24 600 оценява се отвън навътре нестриктно (нормално, лениво) оценяване Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x нарича се още call-by-name (извикване по име) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x нарича се още call-by-name (извикване по име) може да спести сметки, понеже изхвърля боклуците Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) head [3] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) head [3] 3 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! нещо повече: Теорема (за нормализация, Church-Rosser) Ако има някакъв ред на оценяване на програмата, който достига до резултат, то и с нормална стратегия на оценяване ще достигнем до някакъв резултат. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! нещо повече: Теорема (за нормализация, Church-Rosser) Ако има някакъв ред на оценяване на програмата, който достига до резултат, то и с нормална стратегия на оценяване ще достигнем до някакъв резултат. Следствие Ако с нормално оценяване програмата даде грешка или не завърши, то няма да получим резултат с никоя друга стратегия на оценяване. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Избягва се повторението чрез споделяне на общи подизрази Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) ((2 2 + 2) 2 + 2 2 + 2) + (2 2 + 2) 2 + 2 2 + 2... Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Избягва се повторението чрез споделяне на общи подизрази Заместването се извършва чак когато е абсолютно наложително Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." ако f е конструктор (константа), оценката остава f e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." ако f е конструктор (константа), оценката остава f e ако f = \p -> t, където p е образец, редът на оценяване зависи от образеца! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): преминава се към оценката на e ако се установи, че тя е от вида (e 1,e 2,...,e n ), преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n всъщност е еквивалентно да разгледаме p като p 1 :p 2 :...:p n :[] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n всъщност е еквивалентно да разгледаме p като p 1 :p 2 :...:p n :[] ако има няколко равенства за f с използване на различни образци, се търси кой образец пасва отгоре надолу Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y 1 + 5 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y 1 + 5 6 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [4..1000]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [4..1000]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[5..1000]))... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[5..1000]))...... let p=isprime; z=4; zs=[5..1000] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [4..1000])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [4..1000]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [4..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[5..1000]))...... let p=isprime; z=4; zs=[5..1000] in if p z then z:filter p zs else filter p zs...... let p=isprime; z=4; zs=[5..1000] in if False then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[6..1000] in if True then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[6..1000] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [6..1000]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[6..1000] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [6..1000]) 1 let xs=filter isprime [6..1000] in (\n -> xs!! (n-1)) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[6..1000] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [6..1000]) 1 let xs=filter isprime [6..1000] in (\n -> xs!! (n-1)) 1 let xs=filter isprime [6..1000]; n=1 in xs!! (n-1) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [5..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[6..1000])......let p=isprime; z=5; zs=[6..1000] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[6..1000] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [6..1000]) 1 let xs=filter isprime [6..1000] in (\n -> xs!! (n-1)) 1 let xs=filter isprime [6..1000]; n=1 in xs!! (n-1) (\(y:_) 0 -> y) (filter isprime [6..1000]) 0 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])...... let p=isprime; z=6; zs=[7..1000] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])...... let p=isprime; z=6; zs=[7..1000] in if p z then z:filter p zs else filter p zs...... let p=isprime; z=6; zs=[7..1000] in if False then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])...... let p=isprime; z=6; zs=[7..1000] in if p z then z:filter p zs else filter p zs...... let p=isprime; z=6; zs=[7..1000] in if False then z:filter p zs else filter p zs...... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [7..1000]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])...... let p=isprime; z=6; zs=[7..1000] in if p z then z:filter p zs else filter p zs...... let p=isprime; z=6; zs=[7..1000] in if False then z:filter p zs else filter p zs...... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [7..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (7:[8..1000])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [6..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[7..1000])...... let p=isprime; z=6; zs=[7..1000] in if p z then z:filter p zs else filter p zs...... let p=isprime; z=6; zs=[7..1000] in if False then z:filter p zs else filter p zs...... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [7..1000]...... let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (7:[8..1000])...... let p=isprime; z=7; zs=[8..1000] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[8..1000] in if True then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[8..1000] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [8..1000]) 0 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[8..1000] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [8..1000]) 0 let y=7 in y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[8..1000] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [8..1000]) 0 let y=7 in y 7 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

Потоци Потоци в Haskell Можем да си мислим, че аргументите в Haskell са обещания, които се изпълняват при нужда Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 15 / 27

Потоци Потоци в Haskell Можем да си мислим, че аргументите в Haskell са обещания, които се изпълняват при нужда В частност, x:xs = (:) x xs, където Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 15 / 27