
- •1. Поколения языков программирования.
- •2.Понятие фп, история развития.
- •1 . Трактовка функции через понятие переменная
- •2. Определения без переменных:
- •3.Программирование при помощи функций.
- •4. Программирование при помощи процедур.
- •5. Символьные данные в строго-функциональных языках.
- •6.Элементарные селекторы, конструкторы и предикаты.
- •7. Рекурсивные функции.
- •8. Проблема выбора подфункции
- •9. Накапливающий параметр — аккумулятор
- •10. Локальное определение.
- •11. Функции высших порядков.
- •12. Фвп применительно к языку Haskell.
- •13. Основы лямбда исчисления
- •14. Правило преобразования лямбда выражения.
- •15. Ромбическое свойство системы редукций.
- •16. Стандартные порядки редукций.
- •18. Структуры данных и их типы на языке Haskell.
- •1. Синонимы типов
- •19. Понятие модуля в Haskell.
- •Абстрактные типы данных
- •Другие аспекты использования модулей
- •20. Классы и их экземпляры в Haskell.
- •21. Наследование в языке Haskell.
- •22. Сорта типов и структуры данных.
- •[Править]Определение
- •[Править]Примеры
10. Локальное определение.
Часто бывает полезно вычисляя значения выражении давать им имена с тем, чтобы значения эти можно было повторно использовать.
Sump(x) = если равно (х,нил) то двучлен (0,1) иначе двучлен (сар(сумпроизв(сдр(х)))+сар(х), сар(сдр()сумпроизв(сдр(х)))*сар(х))
Неэффективность: в 2 раза увеличивается количество вычислений сумпроизв(сдр(х))
Для решения проблем неэф сущ лучшее средство чем введение доп функции
Введение локальных определений в Лисп: пусть и где
Сумпроизв(х)= если равно (х,нил) то двучлен(0,1) иначе {пусть z = сумпроизв(сдр(х)) двучлен(сар(з)+сар(х), сар(сдр(з))*сар(х))}
Область действия заключается в фигурные скобки.
Сумпроизв(х)= если равно (х,нил) то двучлен(0,1) иначе {пусть н = сар(х) и z = сумпроизв(сдр(х)) {пусть s=car(z) p = cdr(car(z)) двучлен(n+s, n*p)}}
Haskell let where
Let y = a*b
F x=(x+y)/y
In f c + f d
F x y | y>z=
| y<z=
Where z = x*x
11. Функции высших порядков.
Функции высших порядков – функция принимающая другие функции в качестве аргументов.
Умн(у,з)=у*з
Редукция(х,умн,1)
Накопить(н,з) = двучлен(н+сар(з), н*сар(сдр(з)))
Сумпроизв(х)=редукция(х, накопить, двучлен(0,1))
12. Фвп применительно к языку Haskell.
на вход подается текстовая матрица, необходимо удалить из нее все имеющиеся пробелы, вывести результат -- Удалить из предложения любой символ delchar :: [Char] -> Char -> [Char] delchar [] _ = [] delchar (x:xs) k = if (x == k) then delchar xs k else x : delchar xs k -- применяем какую-либо функцию к строке текстовой матрицы map2d :: ([Char] -> Char -> [Char]) -> [[Char]] -> Char -> [[Char]] map2d f [[]] _ = [[]] map2d f [] _ = [] map2d f (x:xs) k = f x k: map2d f xs k -- удаление любого символа из текстовой матрицы delsim :: [[[Char]]] -> Char -> [[[Char]]] delsim [[[]]] _ = [[[]]] delsim [[]] _ = [[]] delsim [] _ = [] delsim (x:xs) k = map2d delchar x k : delsim xs k -- удаление пробелов из текстовой матрицы delspace :: [[[Char]]] -> [[[Char]]] delspace [[[]]] = [[[]]] delspace [[]] = [[]] delspace [] = [] delspace (x:xs) = map2d delchar x (' ') : delspace xs
fact::Integer->Integer
fact 0 = 1 -- если получаемое значения = 0,то факториал = 1.
fact n | n>0 = n * fact (n-1) -- | - знак предшевствующий охраняющему выражению.
lenght::[Integer]->Integer
lenght [] = 0
lenght (x:xs) = 1 + lenght xs
selection :: (Integer->Integer)-> [Integer]->Integer->Integer
selection _ [] _=0 -- если получаемый массив пуст возвращаем 0.
selection f x n= if (n<z) then select f (4*(z-n)) 1 x + selection f x (n+1)
else select f (4*(z-n)) 1 x
where z=(quot (lenght x) 4)
-- проверяем существование выбираемого элемента, если не последний требуемый элемент то запускаем функцию выбора и прибавляем к ее результату результат рекурсивного вызова функции выборки
-- если же элемент последний из требуемых то вызываем функцию выборки
select ::(Integer->Integer)-> Integer->Integer->[Integer]->Integer
select _ _ _ [] =0 -- если получаемый массив пуст возвращаем 0.
select f n k x = if (n==k) then f (head x) else select f n (k+1) (tail x)
-- если № текущего элемента = требуемому № запускаем функцию f от головы списка X,
--иначе рекурсивно вызываем функцию выбора с параметрами: функция для вычисления , № требуемого элемента, увеличенный на единицу № текущей позиции и хвост массива Х
main :: ( (Integer->Integer)->[Integer]->Integer->Integer)->[[Integer]]->Integer
main _ [] = 0 -- если получаемый массив пуст возвращаем 0
main func (x:xs) = func fact x 0 + main func xs -- вызываем получаемую функцию func с параметрами вида: функция вычисляющая факториал и голова массива
--и прибавляем к рез-ту значение возвращаемое при рекурсивном вызове функции main с параметрами вида: полученная функция func и хвост массива.
start :: [[Integer]]->Integer
start [] = 0
start x = main selection x