Дефиниране на функции в Haskell

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

-

C++

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

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

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

Slide 1

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

Lush Green

Проф

Lush Green

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

Microsoft Word - VM22 SEC55.doc

3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението

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

Mathematica CalcCenter

Резултати от редовен изпит по Химия г. Вх. Вх. Пол Словом Оценка номер номер Пол Словом Оценка 7500 Жена Много добър Жена Среден

Резултати от предварителен изпит по Биология г. Вх. Номер Пол Словом Цифром Вх. Номер Пол Словом Цифром 1000 Жена Много добър Жен

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

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

Информатика

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

110 (Глава 2. Тензорен анализ 12. Диференциални операции в криволинейни координати Градиент на скаларно поле. Дефиницията (11.5) на градиента чр

Microsoft Word - PRMAT sec99.doc

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

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

Homework 3

Microsoft Word - Sem02_KH_VM2-19.doc

Машинно обучение - въведение

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

Microsoft Word - nbb2.docx

МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА

ЕКСПЛОДИРАЩИ ТОЧКИ ГЛАВА 1 МАШИНИ Добре дошли на борда на нашето приключение. Това е математическо приключение базирано върху една моя история (аз съм

Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

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

СТЪПКИ ПРИ ПОДАВАНЕ НА ЕЛЕКТРОННО ЗАЯВЛЕНИЕ

Квадратно уравнение ax 2 + bx + c = 0 = a(x x 1 )(x x 2 ) x 1,2 = b ± b2 4ac 2a Формули за съкратено умножение (a + b) 2 = a 2 + 2ab + b 2 (a b) 2 = a

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

Homework 2

Microsoft Word - Lecture 9-Krivolineyni-Koordinati.doc

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Microsoft Word - Tema-8-klas-PLOVDIV.doc

ПРОГРАМНО ОСИГУРЯВАНЕ НА КОМПЮТЪРА

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

Препис:

Дефиниране на функции в Haskell Трифон Трифонов Функционално програмиране, 2019/20 г. 27 ноември 2019 г. Тази презентация е достъпна под лиценза Creative Commons Признание-Некомерсиално-Споделяне на споделеното 4.0 Международен cbea Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 1 / 15

Разглеждане на случаи Разглеждане на случаи Можем да дефинниране на функции с разглеждане на случаи по параметрите. Условието на всеки случай се нарича пазач. <име> {<параметър>} { <пазач> = <израз> } + <име> <параметър 1 > <параметър 2 >... <параметър k > <пазач 1 > = <израз 1 >... <пазач n > = <израз n > ако <пазач 1 > е True връща <израз 1 >, а ако е False:... ако <пазач n > е True връща <израз n >, а ако е False: грешка! За удобство Prelude дефинира otherwise = True Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 2 / 15

Разглеждане на случаи Разглеждане на случаи примери fact n n == 0 = 1 n > 0 = n * fact (n - 1) n < 0 = error "подадено отрицателно число" fact (-5) Грешка! добра практика е да имаме изчерпателни случаи можем да използваме стандартната функция error grade x x >= 5.5 = "Отличен" x >= 4.5 = "Много добър" x >= 3.5 = "Добър" x >= 3 = "Среден" otherwise = "Слаб" Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 3 / 15

Локални дефиниции Локални дефиниции с let let { <дефиниция> } + in <тяло> let <дефиниция 1 > <дефиниция 2 >... <дефиниция n > in <тяло> <дефиниция i > се въвеждат едновременно областта на действие на дефинициите е само в рамките на let конструкцията може да са взаимно рекурсивни Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 4 / 15

Локални дефиниции Примери за let let x = 5 in x + 3 8 let f x = y + x 63 y = 7 in f 2 * y fact2 n = let fact n = if n == 0 then 1 else n * fact (n-1) in (fact n)ˆ2 В интерактивен режим (GHCi) let може да се използва без in за въвеждане на нови дефиниции Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 5 / 15

Локални дефиниции Локални дефиниции с where <дефиниция-на-функция> where { <дефиниция> } + <дефиниция-на-функция> where <дефиниция 1 > <дефиниция 2 >... <дефиниция n > <дефиниция i > се въвеждат едновременно областта на действие на дефинициите е само в рамките на дефиницията на <функция> може да са взаимно рекурсивни Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 6 / 15

Локални дефиниции Примери за where sumlastdigits n = lastdigit n + lastdigit (stripdigit n) where lastdigit = ( mod 10) stripdigit = ( div 10) quadratic a b c a == 0 = "линейно уравнение" d > 0 = "две реални решения" d == 0 = "едно реално решение" otherwise = "няма реални решения" where d = b^2-4*a*c Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 7 / 15

Локални дефиниции Пример за комбиниране на let и where area x1 y1 x2 y2 x3 y3 = let a = dist x1 y1 x2 y2 b = dist x2 y2 x3 y3 c = dist x3 y3 x1 y1 p = (a + b + c) / 2 in sqrt (p * (p - a) * (p - b) * (p - c)) where dist u1 v1 u2 v2 = sqrt (du^2 + dv^2) where du = u2 - u1 dv = v2 - v1 Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 8 / 15

Локални дефиниции Сравнение на let и where let е израз, който може да участва във всеки израз where може да се използва само в рамките на дефиниция where дефинициите са видими при всички случаи с пазачи let са удобни когато има само едно <тяло> стилистична разлика: с let помощните дефиниции се дават първи с where акцентът пада върху основната дефиниция Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 9 / 15

Двумерен синтаксис Подравняване на дефинициите let h = f + g b x = 2 in b h а защо не: let h = f + g b x = 2 in b h Подравняването в Haskell има значение! Обхватът на блок от дефиниции се определя от това как са подравнени. Дефинициите точно подравнени по първата са в същия блок Дефинициите вдясно от първата са в нов вътрешен блок Дефинициите вляво от първата са във външния блок Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 10 / 15

Двумерен синтаксис Двумерен синтаксис пример area x1 y1 x2 y2 x3 y3 = let a = dist x1 y1 x2 y2 b = dist x2 y2 x3 y3 c = dist x3 y3 x1 y1 p = (a + b + c) / 2 in sqrt (p * (p - a) * (p - b) * (p - c)) where dist u1 v1 u2 v2 = sqrt (duˆ2 + dvˆ2) where du = u2 - u1 dv = v2 - v1 Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 11 / 15

Двумерен синтаксис Алтернативен синтаксис за блокове Всъщност подравняването е синтактична захар за блок в Haskell { { <дефиниция> ; } } { <дефиниция 1 > ;... <дефиниция n > [;] } Интуитивни правила: при първия символ на дефиниция запомни позицията и сложи { новият ред е подравнен по първия сложи ; новият ред е по-наляво сложи } новият ред е по-надясно не слагай нищо, счита се за продължение на предния ред Пазачите не използват синтаксис за блокове, можем безопасно да ги пишем и на един ред: fact n n == 0 = 1 otherwise = n * fact (n-1) Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 12 / 15

Образци Поредица от равенства Можем да дефинираме функция с поредица от равенства: fact 0 = 1 fact n = n * fact (n-1) Можем да имаме произволен брой равенства... fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2)... или варианти за различните параметри gcd 0 0 = error "няма най-голям общ делител" gcd x 0 = x gcd 0 y = y gcd x y x > y = gcd (x-y) y otherwise = gcd x (y-x) Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 13 / 15

Образци Образци Как се разбира кое равенство да се използва? Видът на формалните параметри наричаме образец Търси се на кой образец пасва фактическия параметър Избира се първият образец отгоре надолу Видове образци: литерали пасват при точно съвпадение променливи пасват винаги анонимен образец _ пасва винаги без да свързва фактическата стойност с име Пример: False && _ = False _ && b = b (&&) False _ = False (&&) _ b = b Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 14 / 15

Образци Повторение на променливи Можем ли да напишем gcd 0 0 = error "няма най-голям общ делител" gcd x 0 = x gcd 0 y = y gcd x x = x gcd x y x > y = gcd (x-y) y otherwise = gcd x (y-x) Не! Всички променливи в образците трябва да са уникални Няма унификация, както в Пролог Има езици за функционално и логическо програмиране, в които това е позволено (напр. Curry) Трифон Трифонов (ФП 19/20) Дефиниране на функции в Haskell 27 ноември 2019 г. 15 / 15