- •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. Сорта типов и структуры данных.
- •[Править]Определение
- •[Править]Примеры
16. Стандартные порядки редукций.
Редекс (redex) – выражение, к которому применима одна из редукций.
Reducible Expression – редуцируемое выражение.
Выражение может содержать (или не содержать) один или несколько редексов.
Самый левый (самый правый) редекс – текстуально расположен левее (правее) других.
Самый внутренний редекс – не содержит внутри себя других редексов.
Самый внешний редекс – не содержится внутри никакого другого редекса.
Аппликативный порядок редукций – редукция всегда применяется к самому левому из самых внутренних редексов.
Нормальный порядок редукций – редукция всегда применяется к самому левому из самых внешних редексов.
Пример.
17. Сравнение различных порядков редукций.
Аппликативный порядок (АПР) |
Нормальный порядок (НПР) |
Не приводит к копированию одних и тех же выражений, если они не находятся в нормальной форме. |
Одни и те же выражения аргументов могут многократно копироваться при подстановке в тело лямбда-выражения. |
Выполняет редукцию даже тех выражений, которые в дальнейшем могут быть отброшены. |
Никогда не редуцирует выражение, если это может оказаться впоследствии ненужным. |
Может не приводить к нормальной форме, даже если она существует. |
Всегда приводит выражение к нормальной форме, если только она вообще существует. |
Преобразование выражения к нормальной форме в АПР соответствует энергичному порядку вычислений выражений в языках программирования.
Преобразование выражения к нормальной форме в НПР соответствует вычислениям выражений с подстановкой аргументов «по наименованию».
Отложенные (ленивые) вычисления(В традиционных языках программирования (например, C++) вызов функции приводит к вычислению всех аргументов. Этот метод вызова функции называется вызов-по-значению. Если какой-либо аргумент не использовался в функции, то результат вычислений пропадает, следовательно, вычисления были произведены впустую. В каком-то смысле противоположностью вызова-по-значению является вызов-по-необходимости (ленивые вычисления). В этом случае аргумент вычисляется, только если он нужен для вычисления результата.)
Проблема конфликта имен.
λx.((λy.λx.+
x
y)
x)
λx.(λx.+
x
x)
λx.((λy.λx.+ x y) x) → α λz.((λy.λx.+ x y) z) λx.(λz.+ x z)
α λz.((λy.λx.+ x y) x) →ƞ (λx. λx + x y)
Для устранения этой проблемы вводится понятие слабая заголовочная нормальная форма, которая является модификацией обычной нормальной формы.
Выражение, не имеющее свободных переменных (замкнутое) находится в СЗНФ, если оно имеет один из следующих видов:
1) Константа – c
2) Определение функции - λx.E
3) Частичное применение функции - P E1 E2 ... Ek (известная) функция, которая требует n аргументов n>k
Выражение λx.((λy.λx.+ x y) x) находится в СЗНФ.
Вычисления, происходящие при исполнении программы в «ленивых» вычислениях, соответствуют редукции выражения в НПР до приведения к СЗНФ, дополненной эффектом «разделения» значений переменных при подстановке аргумента, еще не находящегося в СЗНФ, т.е. для ленивых вычислений можно использовать ссылочную форму подстановки.
(λx.+ x x)(* 2 3) + (* 2 3) (* 2 3) →δ + 6 (* 2 3) →δ + 6 6 →δ 12
