Цель: освоить базовые приёмы и абстракции функционального программирования: функции, поток управления и поток данных, сопоставление с образцом, рекурсия, свёртка, отображение, работа с функциями как с данными, списки. В рамках лабораторной работы вам предлагается решить несколько задач проекта Эйлер. Список задач – ваш вариант. Для каждой проблемы должно быть представлено несколько решений:
-
монолитные реализации с использованием:
- хвостовой рекурсии;
- рекурсии (вариант с хвостовой рекурсией не является примером рекурсии);
-
модульной реализации, где явно разделена генерация последовательности, фильтрация и свёртка (должны использоваться функции reduce, fold, filter и аналогичные);
-
генерация последовательности при помощи отображения (map);
-
работа со спец. синтаксисом для циклов (где применимо);
-
работа с бесконечными списками для языков поддерживающих ленивые коллекции или итераторы как часть языка (к примеру Haskell, Clojure);
-
реализация на любом удобном для вас традиционном языке программировании для сравнения.
Требуется использовать идиоматичный для технологии стиль программирования.
Цель: освоиться с построением пользовательских типов данных, полиморфизмом, рекурсивными алгоритмами и средствами тестирования (unit testing, property-based testing). В рамках лабораторной работы вам предлагается реализовать одну из предложенных классических структур данных (список, дерево, бинарное дерево, hashmap, граф...). Требования:
-
Функции:
- добавление и удаление элементов;
- фильтрация;
- отображение (map);
- свертки (левая и правая);
- структура должна быть моноидом.
-
Структуры данных должны быть неизменяемыми. Если язык допускает изменение данных – необходимо это протестировать.
-
Реализованные функции должны быть встроены/совместимы со стандартными интерфейсами/библиотекой.
-
Библиотека должна быть протестирована в рамках unit testing.
-
Библиотека должна быть протестирована в рамках property-based тестирования (как минимум 3 свойства).
-
Структура должна быть полиморфной.
-
Требуется использовать идиоматичный для технологии стиль программирования.