19 lines
2.0 KiB
Plaintext
19 lines
2.0 KiB
Plaintext
Практическое задание 4. Тестирование в Haskell
|
||
№ 12
|
||
|
||
Создать проект в stack. Функции записать в библиотеку Lib.hs и ограничить доступ к вспомогательным функциям. Тесты записать в Spec.hs.
|
||
|
||
Функция 1: Напишите функцию проверки равенства по модулю isCongruent :: Int -> Int -> Int -> Bool, которая проверяет, равны ли два числа по модулю третьего числа. Используя QuickCheck, проверьте следующие свойства:
|
||
|
||
1. Если два числа равны по модулю, то их разность делится на модуль:
|
||
isCongruent a b m == (modulus (a - b) m == 0).
|
||
2. Равенство по модулю является симметричным:
|
||
isCongruent a b m == isCongruent b a m.
|
||
3. Если одно число равно другому, то они равны по любому модулю:
|
||
если a == b, то isCongruent a b m == True.
|
||
|
||
Функция 2: Напишите функцию filterByPredicate :: (a -> Bool) -> [a] -> [a], которая фильтрует элементы списка по заданному предикату. Используя QuickCheck, проверьте следующие свойства:
|
||
|
||
1. Все элементы результата удовлетворяют предикату: для каждого элемента x из результата должно выполняться условие: predicate x == True.
|
||
2. Длина результата не превышает длину исходного списка: length (filterByPredicate predicate xs) <= length xs.
|
||
3. Если предикат всегда возвращает True, то результат совпадает с исходным списком: если predicate x == True для всех x, то filterByPredicate predicate xs == xs. |