Все Лекции
.pdf
Функциональное программирование. Неизменяемые значения
•Значения не изменяются (Data are immutable):
•Любая операция в программе отображает входные значения на выходные, но не изменяет данные «по месту».
•Иными словами, функции не вызывают побочных эффектов.
•Функции взаимодействуют со своим окружением, принимая аргументы и возвращая результат.
•Для любых входных данных вызов функции может быть заменен на ее результат без изменения семантики программы.
18
Функциональное программирование. Неизменяемые значения
Обычная(mutable) переменная
Короткая форма объявления. Тип x не задается явно, а выводится (deduced, inferenced) из типа инициализатора.
Неизменяемая(Immutable) переменная
Короткая форма объявления. Тип x не задается явно, а выводится(deduced, inferenced)из типа инициализатора.
19
Функциональное программирование. Неизменяемые значения
Преимущества:
•Программы легко тестируются.
•Программы (потенциально) верифицируемы.
•Программы могут быть распараллелены.
Недостатки:
•Повышенное потребление памяти.
20
Функциональное программирование. Императивный и функциональный подходы
def gcd (x: Long, y: Long) : Long =
{
var a= x var b= y
while (a!= 0) {
val temp= a a= b % a b= temp}
b
}
•Императивный подход: while-цикл с var.
•While-циклы поддерживаются, но не рекомендуются: они, как правило, используются вместе с var.
21
Функциональное программирование. Императивный и функциональный подходы
def gcd (x:Long, y:Long) : Long = if (y==0) x else gcd (y, x%y)
•Функциональный подход: рекурсия.
•Нет присваиваний и mutable-переменных.
•if возвращает значение. Это значение становится результатом вызова функции (не нужен return).
•Тело функции состоит из единственного if, можно опустить фигурные скобки.
22
Функциональное программирование. Функции и операции
•FunName (argument1,argument2) – Общая форма записи функции.
•Какова семантика вызова функции?
•Запускается алгоритм, заданный FunName, который вычисляет значение результата для переданных аргументов.
•operand1 OpSign operand2 – Форма записи операции
•Какова семантика операции?
•Запускается алгоритм, заданный операцией OpSign, вычисляющий значение результата для заданных операндов.
23
Функциональное программирование. Функции и операции
•Традиционные (инфиксная, префиксная, постфиксная) операции считаются альтернативными формами более общей конструкции вызова функции/метода.
•Таким образом, можно считать знак операции синонимом (alias) имени соответствующей функции/метода, а традиционную запись – альтернативной формой вызова.
•Можно вводить собственные версии стандартных операций для пользовательских типов.
24
Функциональное программирование. Функции и операции
•Система типов С++ гетерогенная (неоднородная): существуют предопределенные и пользовательские типы.
•Для базовых типов есть стандартные операции.
•Для пользовательских типов (классов) можно задать собственные версии стандартных операций.
•Арность и приоритеты операций нельзя изменять.
•Не допускается введение новых операций. Язык должен быть расширяемым, но не изменяемым (Б.Страуструп)
•Могут быть заданы собственные версии всех общеупотребительных операций, а также операции индексации [], операции вызова (), операции new и delete.
25
Функциональное программирование. Функции и операции
26
Функциональное программирование. Функции и операции
Нотация вызова
Традиционная инфиксная нотация
Можно вводить собственные знаки операций |
Любой метод можно вызвать27 |
