Skip to content

Latest commit

 

History

History

week-01

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Седмица 1 - Функционален стил и интро в Хаскел

The problem with Haskell is that it's a language built on lazy evaluation and nobody's actually called for it.

Материал

  • Първи час.

    • Какво характеризира функционалният стил.

      • Програмите ни се конструират чрез композиции и извиквания на функции.
      • Функциите са дървета от изрази.
    • Чисти функции.

    • Мързеливост в Xаскел.

    • Статични типове.

    • Подкарване на код:

      sudo apt-get install haskell-platform
      ...
      ghci
      • baby.hs

        • :l baby
        • :r
      • Аритметични операции. - +, -, *, /. Умножене по отрицателно число - заграждаме в скоби - 420 * (-69)

      • Булеви операции - &&, ||, not.

      • Равенство - ==, /=.

      • Бинарни функции - инфиксен синтаксис.

      • div 24601 336 vs 24601 `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

        • Set-builder notation

          Пример

          Анотиран пример

        • Еквивалентен пример на Хаскел

          > 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]

Задачи

  1. Да се дефинира предикат за проверка на четност even' n.
  2. Да се дефинира функция пресматаща N! = 1 * 2 * ... * N. factorial n
  3. Да се дефинира функция за вдигане на число на тепен. pow x n
  4. Да се дефинира функция за бързо вдигане на степен. Използвайте свойството: Aко n е четно, то xn = (x(n/2))2. fastPow x n
  5. Да се дефинира функция за намиране на n-тото число на Фибоначи. fib n
  6. Да се дефинира предикат който проверява дали дадено число е просто. isPrime n
  7. Да се дефинира функция намираща най-големият общ делител на две числа. gcd' a b