Шаг 110.
Основы языка Haskell. Функционалы (функции высшего порядка). Задачи для самостоятельного решения

    На этом шаге мы приведем задачи для самостоятельного решения.


   Замечание. Найдите ошибки, описки, неточности и прочие изъяны в приведенных задачах.

1. Непосредственное применение функционалов из библиотеки Prelude

    1*. Определите назначение следующих функций:

   (1) ddd:: [Int] -> [Int]
       ddd lst = map (`mod` 2) lst

   (2) abc:: [Int] -> Bool
       abc lst = not (sum (map (`rem` 2) lst)>0)               

   (3) xil:: Int -> [[Int]] -> Int
       xil x lst = length (filter (elem x) lst)

   (4) f lst1 lst2 = filter (< 0) lst1 ++ filter (>= 0) lst2
       test =   f [1,2,(-1)] [(-3),5,6]    == [(-1),5,6]
             && f [1,(-2),(-1)] [3,5,6]    == [(-2),(-1),3,5,6]
             && f [1,2,1] [(-3),(-5),(-6)] == []

   (5) f:: Double -> Int -> Double
       f x k = sum (take k (tail (iterate sin x)))
       -------------------------------------------
       -- Неудачные тестовые примеры:
       -----------------------------------------
       test1 = abs(f 1 1 - sin 1)<0.000000000001
       test2 = abs(f 1 3 - (sin 1)-((sin.sin) 1)-((sin.sin.sin) 1))
               <0.000001

   (6) length (takeWhile (=='0') (reverse (show (product [1..45]))))

   (7) map (\y -> (y,y^2))
           (filter (\x -> elem '3' (show (x^2))) [1..100])

   (8) log2 x = toInteger (length (takeWhile (>1)
                                             (iterate (/2) x)))

   (9) word2Int:: [Char] -> [Int]
       word2Int wrd = map (\x -> ord x - ord '0') wrd
       ----------------------------------------------
       test1 = word2Int wrd==map digitToInt wrd
            where wrd = "1235234345735745674567456742342342352342"

    2*. Напишите функцию, в которой используется функционал filter с предикатом >, возвращающую список элементов заданного списка, больших 5.

    3*. Напишите функцию, содержащую функционал span с предикатом >, разделяющую заданный список на два и возвращающую пару полученных списков.


   Указание. "Точкой деления" исходного списка является первый элемент, для которого предикат > принимает истинное значение.

    4*. Напишите функцию, содержащую функционал span с предикатом <=, разделяющую заданный список на два и возвращающую список из полученных списков.


   Указание. В первый список поступают элементы из начала исходного, которые удовлетворяют предикату <=, во второй - оставшиеся элементы исходного списка.
5*. Напишите функцию, в которой используется функционал dropWhile с предикатом ==, удаляющую элементы из начала списка.

    6. Напишите функцию, использующую функционалы и вычисляющую значение функции

   sin(x)+sin(sin(x))+sin(sin(sin(x)))+ ... +sin(sin...(sin(x)...).
                                                     k раз

2. Обработка списков с помощью функционалов

    1*. Напишите функцию, использующую функционалы и конструирующую список из двух заданных таким образом, что из первого списка берутся только отрицательные числа, а из второго - только положительные.

    2. Напишите функцию, использующую функционалы и объединяющую первую половину элементов первого списка со второй половиной элементов второго списка.

    3. Напишите функцию, использующую функционалы и конструирующую список из n элементов k, где k - неотрицательный минимальный элемент заданного списка.

    Если минимальный элемент списка будет отрицательным числом, то функция должна вернуть пустой список.

    Со следующего шага мы начнем рассматривать потенциально бесконечные списки.




Предыдущий шаг Содержание Следующий шаг