Skip to the content.

Седмица 4 - Ламбда функции. За типове и класове

Ray tracer

Материал

Какво правихме предния път

Не остана време за

Типове

:t инспектиране на тип в GHCi.

Експлицитно задаване на тип - ::

Често срещани типове:

empty tuple () is also a type

Типови променливи

Типови класове (typeclasses)

Нещо като интерфейси за типове. Ако определен тип инстанцира определен типов клас то класът е имплементирал функциите които този типов клас изисква.

Everything before the => symbol is called a class constraint

Да разгледаме :t elem.

Дефиниране на типове

Типовете - множества от стойности.

Алгебрични дата типове

Рекурсивни типове и типове с параметри

Record syntax

data Student' = Student'
  { firstName :: String,
    lastName :: String,
    facultyNumber :: Int,
    bio :: String
  }
  deriving (Show)

Задачи

  1. Имплементирайте типа Vector a a a и го направете инстанция на Num.
  2. Да се дефинира ф-я, multiply a b, която умножава 2 матрици. (може да приемете, че аргументите, които ще и се подават ще са валидни матрици, които могат да се умножат)
  3. Дефинирайте генеричен тип Histogram a, който представлява вектор с честоти на елементи от тип а.

    • Дефинирайте ф-я histogram l, която намира хистограмата на елементите в l и връща стойност от тип Histohram a.

      Пример:

      histogram ['a', 'b', 'c', 'a', 'a', 'c']
      > Histogram [('a', 3), ('b', 1), ('c', 2)]
      
    • Дефинирайте ф-я plotHistogram h, която приема елемент от тип Histogram a и връща стрингова репрезентация на bar-chart на хистограмата. (Ключовете в хистограмата трябва да са Ord, и да се сортират по големина)

      Пример:

      h = Histogram [('a', 3), ('b', 1), ('c', 2)]
      plotHistogram h
      > #
        #   #
        # # #
        =====
        a b c
      
  4. Имплементирайте генерична колекция двоично дърво - BinTree a.
  5. Имплементирайте ф-я за insertBST el tree, която приема елемент и дърво и връща ново дърво, в което елемента е на правилното място спрямо свойството на двоичните дървета за търсене (Binary Search Trees insertion).
  6. Имплементирайте ф-я elemBST el tree, която проверява дали елемент е част от даденото дърво, предполагайки че дървото е двоично дърво за търсене, т.е. изпълнява BS свойството.
  7. Докажете че BinTree е showable по начина показан в примера. По-не-фенси казано - имплементирайте типовия клас Show за BinTree. (може да предположите че елементите на дървото са едносимволни)

    Пример:

    t = BinTree 1
          (BinTree 2 (BinTree 4 EmptyTree EmptyTree) EmptyTree)
          (BinTree 3
            (BinTree 5 (BinTree 7 EmptyTree EmptyTree) EmptyTree)
            (BinTree 6 EmptyTree EmptyTree))
    print t
    >  1
        |-2
        | |-4
        | | |-x
        | | |-x
        | |-x
        |-3
          |-5
          | |-7
          | | |-x
          | | |-x
          | |-x
          |-6
            |-x
            |-x