Група 1, Упражнение 9, Задачи
Продукт се представя с наредена двойка от вида (име, цена). Наличността в даден магазин се представя със списък от продукти.type Product = (String,Double)type StoreAvailability = [Product]
Задача 1. Да се напише на Haskell функция closestToAverage :: StoreAvailability -> String, която намира името на продукта, чиято цена е най-близка до средната цена за всички продукти. Ако има повече от един такъв продукт, функцията да връща името на кой да е от намерените.
Пример:store1 = [("bread",1),("milk",2.5),("lamb",10),("cheese",5),("butter",2.3)]closestToAverage store1 ➝ "cheese"
Задача 2. Да се напише на Haskell функция cheaperAlternative :: StoreAvailability -> Int, която намира броя на продуктите, за които има продукт със същото име, но по-ниска цена.
Пример:store2 = [("bread",1),("cheese",2.5),("bread",1),("cheese",5),("butter",2.3)]cheaperAlternative store2 ➝ 1
Задача 3. Нека са дефинирани следните типове:type Student = String -- име на ученикtype Subject = String -- име на предметtype Note = Double -- оценка-- Запис за ученик, съдържащ име на ученик, учебен предмет и оценката на-- ученика по дадения предмет.type Record = (Student, Subject, Note)
Дефинирайте функцията hardestSubject :: [Record] -> Subject, която получава списък от записи за учениците от даден клас и връща името на предмета с най-ниска средна оценка за този клас.
Задача 4. Посещаемостта на ученик по предмет може да се представи чрез списък с елементи от алгебричен тип, който определя дали студент е пропуснал часа (Absent), закъснял е за часа (Late) или е присъствал в часа (Present). За да може да получи срочна оценка, ученикът не може да пропусне повече от n часа и не може да закъснее повече от k пъти подред. Да се дефинира функция от по-висок ред canPass :: Criterion -> (StudentRecord -> Bool), която приема двуелементен вектор, представящ максималния разрешен брой пропуснати часове и поредни закъснения, които може да има даден ученик, и връща функция, която за дадена посещаемост на ученик връща булева стойност, определяща дали този ученик може да получи срочна оценка.
Примери:cP = canPass (1,2)type Misses = Inttype Lates = Inttype Criterion = (Misses, Lates)data Attendance = Absent | Late | Present deriving (Eq, Show)type StudentRecord = [Attendance]cP [Present, Late, Present, Absent, Present, Present, Present, Absent] ➝ FalsecP [Present, Late, Present, Late, Present, Late, Present, Absent, Late, Present] ➝ TruecP [Present, Late, Present, Late, Late, Late, Present, Present, Absent, Present] ➝ False
Задача 5. Разглеждаме непразен списък fs от едноаргументни функции [f1, f2, … , fn], всяка от които е от тип Int -> Int. Дефинирайте функция getOddCompositionValue :: [Int -> Int] -> (Int -> Int), която при подаден такъв списък fs връща като резултат функция, чиято стойност за всяко цяло число x е равна на стойността на композицията на функциите с нечетни поредни номера от fs приложени към x, както следва f1(f3( … (x) … )).
Пример:getOddCompositionValue [(\ x -> x + 1),(\ x -> x * 2),(\ x -> x - 1), (\ x -> x `div` 2)] 2 ➝ 2
getOddCompositionValue [(\ x -> x + 1),(\ x -> x * 2),(\ x -> x * 10), (\ x -> x `div` 2)] 2 ➝ 21