Задачки + кратко обяснение как се пише на Haskell
Страницата не е пълна.
Целта на тази страница е да се даде бърз старт на хората, които учат вечерта преди контролните :)
Пък и да се покаже, че Scheme е грозен език.
Основни понятия
Haskell e строго типизиран език за функционално програмиране. Всичко в Haskell e immutable1
Haskell прилага lazy evaluation2
Задачи за стартиране
Функция, която събира две числа
plus :: Int -> Int -> Int
plus a b = a + b
Обяснение :
Първият ред казва, че функция на име plus, приема 2 аргумента от целочислен тип и връща цяло число за резултат.
Пример : Ако имаме функция, която приема 5 цели числа и връща булева стойност, би имала такава сигнатура :
func :: Int -> Int ->Int -> Int -> Int -> Bool
функцията се вика по следния начин :
> plus 5 4
> 9
> (plus 5 4) -- може и със скоби, ако участва в по-сложни изрази
> 9
Време е за малко рекурсия
Функция, която намира n! (първи вариант)
fact :: Int -> Int
fact 1 = 1
fact n = n * (fact (n-1))
Обяснение :
Първият ред казва, че функцията приема един аргумент от целочислен тип и връща цяло число.
Вторият ред казва, че ако аргументът на функция е 1, то върната стойност е 1
Третият ред показва общият случай на функцията.
Напрактика, написахме математическата дефиниция за факториел на Haskell и тръгна ;) Нека видим други начини за рекурсия и логически конструкции.
Функция, която намира n! (втори вариант)
fact :: Int -> Int
fact n
| n == 1 = 1
| otherwise = n * (fact (n - 1))
Две важни неща
- След fact n няма равно, тъй като функцията използва така наречените гардове (guards)
- Преди всяка вертикална черта | има една шпация разстояние. Haskell е позиционен език за програмиране (като Python) и това е от значение.
Всичко е много просто -
Вертикалната черта проверява за условието (n == 1) и ако то е True, изпълнява израза след равното.
Ако нито една от чертите не е дала резултат True се изпълнява otherwise изразът.
И още един вариант, който използва списъци (за тях по-долу)
Функция, която намира n! (трети вариант)
fact :: Int -> Int
fact n = product [1..n]