Fphaskell

Задачки + кратко обяснение как се пише на 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))

Две важни неща
  1. След fact n няма равно, тъй като функцията използва така наречените гардове (guards)
  2. Преди всяка вертикална черта | има една шпация разстояние. Haskell е позиционен език за програмиране (като Python) и това е от значение.

Всичко е много просто -
Вертикалната черта проверява за условието (n == 1) и ако то е True, изпълнява израза след равното.
Ако нито една от чертите не е дала резултат True се изпълнява otherwise изразът.

И още един вариант, който използва списъци (за тях по-долу)
Функция, която намира n! (трети вариант)

fact :: Int -> Int
fact n = product [1..n]
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License