-
Първи час.
-
Какво характеризира функционалният стил.
- Програмите ни се конструират чрез композиции и извиквания на функции.
- Функциите са дървета от изрази.
-
Чисти функции.
-
Мързеливост в Xаскел.
-
Статични типове.
-
Подкарване на код:
- VSCode plugins
- GHCi
- Haskell Platform
sudo apt-get install haskell-platform ... ghci
-
baby.hs
:l baby
:r
-
Аритметични операции. -
+
,-
,*
,/
. Умножене по отрицателно число - заграждаме в скоби -420 * (-69)
-
Булеви операции -
&&
,||
,not
. -
Равенство -
==
,/=
. -
Бинарни функции - инфиксен синтаксис.
-
div 24601 336
vs24601 `div` 337
-
Още функции -
pred
,succ
,min
,max
. Пример -succ 9 + max 5 4 + 1
-
Изрази - всяка конструкция връща резултат.
-
if-then-else
a = 3 b = 4 if a > b then 88 else 66 > 66
- Дефиниране на функции
<име> [параметър] = <израз>
- Пример
isPythagoreanTriple a b c = a ^ 2 + b ^ 2 == c ** 2
- Извикване на функция
-
-
Втори час
-
Листи
-
Синтаксис -
[1,2,3]
-
Хомогенни
-
head
,tail
,last
,init
- нарисувай диаграма -
Добавяне в лист
5:[1,2,3]
- Добавяне отзад -
[1,2,3] ++ [5]
(линейна операция) [1,2,3]
е синтактична захар за1:2:3[]
'A':" SMALL CAT"
-
[]
,[[]]
и[[],[],[]]
-
Конкатенация -
++
-
Индексиране -
!!
(линейна операция)[1,2,3] !! 2 == 3
-
Още вградени функции -
length
,null
,take
,drop
,sum
,product
,maximum
,minimum
,elem
.6 `elem` [4,5,6,7]
-
Стринговете - Листи от
Char
-ове -
List ranges
-
[1..10]
==[1,2,3,4,5,6,7,8,9,10]
-
[5,10..100]
-
['a'..'z']
-
['K'..'Z']
-
В обратна посока -
[20,19..1]
-
Floating point числата са малко шейди в list ranges
ghci> [0.1, 0.3 .. 1] [0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
-
Не можем да правим неща от сорта на -
[1,2,4,8,16..100]
и да очакваме всички степени на 2ката (демек само аритметични прогресии).
-
-
Сравняване на листи - ако нещата в тях са сравними
[1,2,3] > [2,3,4]
[[1], [2,3]] < [[3]]
[1,2] == [1,2]
-
Безкрайни листи
- Просто не спецфицираме горна граница
- Всички естествени числа
[1..]
Ctl + c
за да спрем принтването
take 10 [1..]
[40, 50 ..]
take 100 [10,0..]
-
cycle
&repeat
take 15 (cycle "NA ") ++ "Batman!"
take 100 (repeat 'A')
-
List comprehensions
-
Еквивалентен пример на Хаскел
> let s = [ 2*x | x <- [0..], x^2 > 3 ] > take 10 s [4,6,8,10,12,14,16,18,20,22]
-
Няколко предиката
ghci> [x | x <- [10..20], x /= 13, x /= 15, x /= 19] [10,11,12,14,16,17,18,20]
boomBoomPow = concat [if x < 2 then "BOOM " else "POW" | x <- [0..2]]
-
Декартово произведение
ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50] [55,80,100,110]
-
-
- Да се дефинира предикат за проверка на четност
even' n
. - Да се дефинира функция пресматаща
N! = 1 * 2 * ... * N
.factorial n
- Да се дефинира функция за вдигане на число на тепен.
pow x n
- Да се дефинира функция за бързо вдигане на степен. Използвайте свойството:
Aко
n
е четно, то xn = (x(n/2))2.fastPow x n
- Да се дефинира функция за намиране на n-тото число на Фибоначи.
fib n
- Да се дефинира предикат който проверява дали дадено число е просто.
isPrime n
- Да се дефинира функция намираща най-големият общ делител на две числа.
gcd' a b