Лямбда-функции
November 3, 2022

Sin * Cos или функция на функции сидит и функцией погоняет

Функции в PascalABC.NET - это объекты первого класса (дословный перевод с англ. first-class objects. Это значит, что функцию можно передавать как параметр в другую функцию и возвращать её как значение другой функции. Это - элементы функционального программирования, в котором функциями можно манипулировать так же как и обычными значениями.

Для иллюстрации мощности PascalABC.NET как функционального языка программирования определим функцию, являющуюся суперпозицикй двух функций f и g. Мы определим её как метод расширения, реализующий операцию умножения - так чтобы можно было писать f*g:

function operator*(f,g: real -> real): real -> real; extensionmethod 
  := x -> f(g(x));

begin
  var fun := Sin * Cos;
  Println(fun(1));
  Println((Cos * Sin)(1));
end.

Результат:

0.514395258523549 
0.666366745392881 

Первое значение - это Sin(Cos(1)), а второе - Cos(Sin(1)).

Результат Sin * Cos мы сохранили в переменную fun. Нетрудно догадаться, что она получит тип real -> real. Результат Cos * Sin мы как функцию применили непосредственно к аргументу 1.

Заключение. Всё просто. PascalABC.NET - мощный функциональный язык, в котором функции - это объекты первого класса.