Skip to content

Instantly share code, notes, and snippets.

@andiogenes
Created October 18, 2023 10:04
Show Gist options
  • Save andiogenes/ce4282f1290ff0fc60a3ecc3eb702f1a to your computer and use it in GitHub Desktop.
Save andiogenes/ce4282f1290ff0fc60a3ecc3eb702f1a to your computer and use it in GitHub Desktop.

Пример задач к контрольной работе

Арифметика

sh :: Double -> Double
sh x = undefined

Реализуйте функцию sh, вычисляющую гиперболический синус:

$$sh~x = \frac{1}{2}(e^x - e^{-x}).$$

Обработка списков с помощью map и filter

Функцию, проверяющую, является ли строка палиндромом, можно определить следующим образом:

isPalindrome :: String -> Bool
isPalindrome xs = xs == reverse xs

В простых случаях функция работает правильно:

s1 = "ABOBA"
a1 = isPalindrome s1

Однако, если входные данные содержат символы в разных регистрах и пробелы, вызов функции выдаёт отрицательный результат:

s2 = "Лёша на полке клопа нашёл"
a2 = isPalindrome s2

Проблему, можно решить, переведя все символы в строке в верхний или нижний регистр, и убрав из неё все пробелы:

s3 = "ЛЁШАНАПОЛКЕКЛОПАНАШЁЛ"
a3 = isPalindrome s3

Для перевода символов в верхний регистр, Haskell предоставляет функции toUpper и toLower, определённые в модуле Data.Char:

import Data.Char

aInUpperCase = toUpper 'a'
aInLowerCase = toLower aInUpperCase

На множестве символов определено отношение эквивалентности:

isSpaceASpace = ' ' == ' '

Определите функцию isPalindrome2, проверяющую, является ли строка палиндромом, но не учитывающую регистр символов и пробелы в строке:

isPalindrome2 :: String -> Bool
isPalindrome xs = undefined

Рекурсивная обработка списков. Легкая задача

Реализуйте функцию replaceAt, которая заменяет i-й элемент списка xs на значение v.

replaceAt :: a -> [a] -> Int -> [a]
replaceAt v xs i = undefined

Пример использования функции:

xs = ['a', 'b', 'c', 'd']

xs1 = replaceAt 'A' xs 0
-- ['A', 'b', 'c', 'd']

xs2 = replaceAt 'D' xs 3
-- ['a', 'b', 'c', 'D']

xs21 = replaceAt 'C' xs 2
-- ['a', 'b', 'C', 'd']

xs3 = replaceAt 'A' xs (-1)
-- "error: index out of range"

xs4 = replaceAt 'B' [] 0
-- "error: index out of range"

xs5 = replaceAt 'E' xs 4
-- "error: index out of range"

Рекурсивная обработка списков. Сложная задача

Напишите функцию dropEveryNth, удаляющую каждый n-й элемент из списка xs.

dropEveryNth :: [a] -> Int -> [a]
dropEveryNth xs n | n <= 0 = error "n should be greater than 0"
dropEveryNth xs n = undefined

Пример использования функции:

xs = [1,2,3,4,5,6,7,8,9,10]

xs1 = dropEveryNth xs 1
-- []

xs2 = dropEveryNth xs 2
-- [1,3,5,7,9]

xs3 = dropEveryNth xs 3
-- [1,2,4,5,7,8,10]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment