Рассмотри функцию увел1, увеличивающую значения всех элем-тов числового списка на 1, и функцию ост2, вычисляющую остаток от деления на 2 для всех элементов списка. увел1=если null(x) то ‘() иначе cons(car(x)+1,увел1(cdr(x))); ост2(x)=если null(x) то ‘() иначе cons(car(x) mod 2, ост2(cdr(x))); Эти определения очень схожи. Можно определить функцию высшего порядка, которая применяет некоторую функцию ко всем элементам списка. Отобр(x,f)=если null(x) то ‘() иначе cons(f(car(x)), отобр(cdr(x),f));
Функция увел 1 и ост2 можно определить, используя функцию отобр: ув1(z)=z+1; увел1(x)=отобр(x,ув1); ос2(z)=z mod 2; ост2(x)=отобр(x,oc2) и т.д.
При написании функции можно избавится от вспомогательных фун-кций, если воспользоваться другим способом определения функции. До сих пор мы вводили функцию с помощью определений вида f(x1,…,xn)=e. Имя f является глобальным, то есть может исполь-ся для определения других функций, а имена параметров x1… являются локальными, то есть могут использоваться только в выражении е. Функция является правилом для вычисления значения по некоторым аргументам. Определение, приведенное выше, связывает с именем f некоторое значение, заключающее в сеье это правило. Это значение является l-выражением l(x1,x2,..,xn)=e. l-выражение выделяет имена параметров x1,x2… и выражение для вычисления значения, использ. эти параметры.
l-выражение обозначает одно и тоже функциональное значение, независимо от имен, выбранных для параметров. Выражения l(z) z+1 и l(x) x+1 обозначают одно и то же и являются взаимозамен-ыми. l-выражения можно использовать в блоках локальных определений "пусть” и "где”, определяя локальные функции. Рассмотрим функцию ув(n)=l(z)z+n, которая возвращает функцию.
Функция высшего порядка комп(f,g)=l(x)f(g(x)) имеет функции и в качестве аргументов, и в качестве результата. Эта функция позволяет определить функцию через композицию других функций.