Строго объяснять не вижу смысла, поскольку придется тратить время на разъяснение массы попутных вещей, начиная от λ-исчисления и Алонзо Чёрча. Если бы Вам было понятно одно из определений, вроде "Лямбда-выражение — это анонимная функция, с которой можно создавать типы делегатов или деревьев выражений", Вы бы не стали писать сюда вопрос. Поэтому постараюсь рассказать "на пальцах" и примерах.
"Лямбды" - это функции (а также, выражения и процедуры), позволяющие эффектно в одном месте и объявить их, и использовать, причем, зачастую, даже не давая этим функциям имени (анонимные функции). Вот такие они "одноразовые".
Записывается лямбда обычно в форме t -> f(t) и читается "t переходит в f(t)". Фактически, тут много общего с обычной функцией, имеющей формальный параметр t и определяющей в своем теле значение при Конечно, параметр может быть и не один.
Изюминка "лямбд" в том, что они могут использоваться на правах простых переменных. Например, можно присвоить переменной "лямбду" и передать её, как параметр в программную единицу вместо функции, например var f:real->real:=t->3*Sin(t)+Cos(t); Tab(f,0,10,0.1);
Лямбды очень активно присутствуют в операциях, пришедших в PascalABC.NET из LINQ .Net, в частности, в проецировании и фильтрации. var n:=ArrGen(20,i->2*i+5).Where(t->Cos(t/6)<0).Count;
Последние версии PascalABC.NET 3.3 имеют очень развитые средства для программирования в функциональном стиле, построенные на "лямбдах". Примеры множественного использования лямбд можно найти в файлах, входящих в стандартную поставку, в также в Справочном руководстве по библиотеке численных методов, ставшей стандартной с версии 3.3.0.1552 от 20.10.2017 (файл \Program Files\PascalABC.NET\Doc\NumLibABC.pdf)
{ PascalABC.NET, но все кроме writeln() должно работать и на TurboPascal. вводит числа рандомно и находит среднее арифметическое чётных чисел и среднее арифметическое индексов нечётных чисел. }
PROGRAM A4; const num = 16; var MT:array [1..num] of byte;// массив чисел i,j:byte;// счетчики even_sum:integer;// сумма четных even_num:byte;// количество четных
indx_sum:integer;// сумма нечетных индексов indx_num:byte;// количество нечетных индексов
BEGIN // условно ввели набор чисел randomize(); for i:=1 to num do MT[i] := random(256); writeln('Начальный массив ', num ,' случайных чисел'); writeln(MT);
// сам алгоритм even_sum := 0; even_num := 0;
indx_sum := 0; indx_num := 0;
writeln(' '); write('Четные числа: ');
for i:=1 to num do begin if not odd(MT[i]) then begin write(MT[i], ' '); even_sum := even_sum + MT[i]; even_num := even_num + 1; end; if odd(i) then begin indx_sum := indx_sum + i; indx_num := indx_num + 1; end; end;
"Лямбды" - это функции (а также, выражения и процедуры), позволяющие эффектно в одном месте и объявить их, и использовать, причем, зачастую, даже не давая этим функциям имени (анонимные функции). Вот такие они "одноразовые".
Записывается лямбда обычно в форме t -> f(t) и читается "t переходит в f(t)".
Фактически, тут много общего с обычной функцией, имеющей формальный параметр t и определяющей в своем теле значение при Конечно, параметр может быть и не один.
Изюминка "лямбд" в том, что они могут использоваться на правах простых переменных. Например, можно присвоить переменной "лямбду" и передать её, как параметр в программную единицу вместо функции, например
var f:real->real:=t->3*Sin(t)+Cos(t); Tab(f,0,10,0.1);
Лямбды очень активно присутствуют в операциях, пришедших в PascalABC.NET из LINQ .Net, в частности, в проецировании и фильтрации.
var n:=ArrGen(20,i->2*i+5).Where(t->Cos(t/6)<0).Count;
Последние версии PascalABC.NET 3.3 имеют очень развитые средства для программирования в функциональном стиле, построенные на "лямбдах".
Примеры множественного использования лямбд можно найти в файлах, входящих в стандартную поставку, в также в Справочном руководстве по библиотеке численных методов, ставшей стандартной с версии 3.3.0.1552 от 20.10.2017 (файл \Program Files\PascalABC.NET\Doc\NumLibABC.pdf)
PascalABC.NET, но все кроме writeln() должно работать и на TurboPascal.
вводит числа рандомно и находит среднее арифметическое
чётных чисел и среднее арифметическое индексов нечётных чисел.
}
PROGRAM A4;
const
num = 16;
var
MT:array [1..num] of byte;// массив чисел
i,j:byte;// счетчики
even_sum:integer;// сумма четных
even_num:byte;// количество четных
indx_sum:integer;// сумма нечетных индексов
indx_num:byte;// количество нечетных индексов
BEGIN
// условно ввели набор чисел
randomize();
for i:=1 to num do
MT[i] := random(256);
writeln('Начальный массив ', num ,' случайных чисел');
writeln(MT);
// сам алгоритм
even_sum := 0;
even_num := 0;
indx_sum := 0;
indx_num := 0;
writeln(' ');
write('Четные числа: ');
for i:=1 to num do begin
if not odd(MT[i]) then begin
write(MT[i], ' ');
even_sum := even_sum + MT[i];
even_num := even_num + 1;
end;
if odd(i) then begin
indx_sum := indx_sum + i;
indx_num := indx_num + 1;
end;
end;
writeln(' ');
writeln('Количество четных чисел ', even_num);
writeln('Среднее арифметическое четных чисел = ',
even_sum, '/', even_num , ' = ', even_sum/even_num );
writeln(' ');
writeln('Количество нечетных индексов нечётных чисел ', indx_num);
writeln('Среднее арифметическое индексов нечётных чисел ',
indx_sum, '/', indx_num, ' = ', indx_sum/indx_num);
END.