Skip to the content.

Седмица 3 - Функции от по висок ред, currying, map, filter, композиране

Материал

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

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

Компилиране на хаскел файл

-- file.hs
main = putStr "Hello world!"

> ghc file.hs
> ./file

Типови псевдоними

Дават ни начин да зададем специфично име на определен тип (може да се използва за задаване на семантично по-подходящи типове)

type Name = String

type StudentIdentifier = Int

type Vector = (Double, Double, Double)

type IntToInt = Int -> Int

Полиморфни типови псевдоними

type Vector а = (а, а, а)

type Function a = a -> a

type BinaryFunction a b c = a -> b -> c

type Predicate a = a -> Bool

Композиция и прилагане на функции

Вижте функцията integrate за по-интересен пример с комбинация на 2те.

Функции от по висок ред

Това са функции които приемта други функции като аргументи и/или връщат функция.

Задачи

  1. Напишете ф-я lSystem axiom rules, която да връща безкраен списък от стрингове със следните свойства:

Пример:

axiom = 'A'
rules = [('A', "AB"), ('B', "A")]
last $ take 7 $ lSystem axiom rules
> ABAABABAABAABABAABABAABAABABAABAAB
  1. Напишете ф-я която да намира приближение на корените на функция по метода на Нютон.

    • Сигнатура - findRoots f iterations x0

    • итерирайте функцията по следната рекурентна дефиниция:

    • Приближаването на резултата изглежда визуално по следния начин:

  2. Имплементирайте ф-я quicksort l която да сортира елементите в даден списък. Quicksort Wikipedia

    Quicksort has become a sort of poster child for Haskell. …even though implementing quicksort in Haskell is considered really cheesy because everyone does it to showcase how elegant Haskell is.

  3. Напишете функция collatz n, която да пресмята редица на Колатз.

    • редицата на Колатз за число n се пресмята като започнем от n и прилагаме итеративно следната трансформация:

      Ако n e четно -> върни n / 2
      Иначе -> върни 3 * n + 1
      
      • редицата приключва когато стигем числото 1.

      • Пример

        > collatz 25
        [25,76,38,19,58,29,88,44,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1]
        
    • (***много повишена трудност) Бонус задачка - намерете редица на Kолатз която не завършва на 1. (напишете израз който търси отговора)