Редактировать

Введение в лямбда-выражения

Лямбда-выражения - базовый примитив программирования на PascalABC.NET. При обучении начинающих они возникают как параметры стандартных подпрограмм и методов.

Учителю психологически трудно перейти на использование лямбда-выражений по нескольким причинам:

  • лямбда-выражения кажутся сложными
  • лямбда-выражения кажутся относящимися лишь к профессиональному программированию
  • нигде в доступной учебной литературе не используются лямбда-выражения

Мы попытаемся развеять эти мифы.

Итак: лямбда-выражения - это просто.

Лямбда-выражение - это функция. Функция отображает параметр на значение. Например, квадратичная функция в школе записывается как

f(x) = x * x

Её можно записать также в виде:

f: x -> x * x

что означает, что функция с именем f сопоставляет каждому x значение x*x.

Запись x -> x * x и называется в PascalABC.NET лямбда-выражением или лямбда-функцией. Заметим, что в отличие от предыдущей записи лямбда-функция не имеет имени. Именно поэтому часто лямбда-функция называется безымянной функцией.

Другие примеры лямбда-функций:

Линейная функция:

x -> 2*x + 3

Функция, проверяющая, чётно ли x, и возвращающая True если чётно и False в противном случае:

x -> x mod 2 = 0

Чаще всего лямбда-функции встречаются как параметры других функций. Далее будет рассмотрено множество подобных примеров.

Генераторы массивов с лямбда-функциями

Для генерации массивов с элементами, заполненными по некоторому правилу, используется функция ArrGen. У неё - две основные модификации.

Генерация по формуле a[i] = f(i)

var a := ArrGen(10,i->f(i));

Здесь первый параметр - количество элементов массива, второй - лямбда функция, переводящая индекс элемента в значение. Нумерация i начинается с нуля.

Можно начать нумерацию с другого значения, указав третий параметр. Например, чтобы заполнить массив квадратами натуральных чисел начиная с 1, требуется написать:

var a := ArrGen(10,i->i*i,1);

Генерация по рекуррентной формуле, в которой следующий элемент определяется по предыдущему

var a := ArrGen(10,1,x->x+2);

Здесь генерируется массив из 10 элементов, первый равен 1, а каждый последующий больше предыдущего на 2

var a := ArrGen(10,1,x->x*2);

Здесь генерируется массив из 10 элементов, первый равен 1, а каждый последующий больше предыдущего в 2 раза