Теоретические сведения. Определим функцию list1 следующим образом:
list1 a g f x = if (null x)
then a
else g(f(car x))(list1 a g f(cdr x)).
Это пример функции достаточно общего вида, из которой, задав конкрет-
ное значение параметров, можно получить целый ряд “более простых”
функций. Можно заметить, что многие функции,оперирующие со списка-
ми, имеют некоторую “общую часть”. Возникает вопрос, можно ли для
класса функций над списками определить такую обобщенную функцию, из
которой путем различного выбора параметров получаются конкретные
представители класса функций. В качестве одной из таких обобщенных
функций предлагается функция list1.
Основная конструкция, которой будем пользоваться -- это список, кото-
рый может быть пустым, либо непустым. В последнем случае у него есть
“голова” и “хвост”, которые в свою очередь также могут быть списками.
Над списками могут выполняться следующие операции:
null : список → булевский,
car : непустой список → (список + атом),
cdr : непустой список → список,
list : (атом + список) → (список → список).
Эти операции связаны друг с другом следующим образом:
null() = true,
null(list x y) = f alse,
car (list x y) = x,
cdr (list x y) = y,
list(car z)(cdr z) = z.
Кроме того, примем сокращение:
list x y = x : y,
и поэтому для n ≥ 2 воспользуемся соглашением об обозначении:
x1, x2, x3, . . . , xn = x1 : (x2 : (x3 : (. . . xn) : . . .(). . .)).
Задача 10.1 Исследовать свойства функции
list1 a g f x = if (null x)
then a
else g(f(car x))(list1 a g f(cdr x)).
Воспользовавшись следующими определениями:
Ix = x, Kxy = x, postf ix x y = append y(ux),
где (ux)- обозначение списка, состоящего из единственного элемен-
та , выразить функции:
(а) length, sumsquares, reverse, identity;
(б) sum, product, append, concat, map.
Уточненная формулировка задачи.Воспользуемся следующими опре-
деленими функций:
(а) ux = x : (),
length x = if null x
then 0 else 1 +length(cdrx),
sumsquares x = if null x
then ()
else(square(car x)) + sumsquares(cdr x),
reverse x = if null x then ()
else append(reverse(cdr x))(ux),
identity x = x,
square x = if null x
then 0
else x × x;
(б) sum x = if null x
then 0
else(car x) + sum(cdr x),
product x = if null x
then 1
else(car x) × product(cdrx),
append x y = if null x
then y
else list(car x)(append(cdr x)y),
concat x = if null x
then ()
else append(car x)(concat(cdr x)),
map f x = if null x
then ()
else(f(car x)) : (map f(cdr x)).
Выполнить шаги алгоритмов для следующих примеров:
sum (1, 2, 3, 4) = 10,
product(1, 2, 3, 4) = 24,
append (1, 2)(3, 4, 5) = (1, 2, 3, 4, 5),
concat((1, 2), (3, 4), ()) = (1, 2, 3, 4),
map square (1, 2, 3, 4) = (1, 4, 9, 16)
Решение. Принимается, что postf ix x y = append y (ux).
list1--1. Рассмотрим случай (а):
length = list1 0 plus (K 1),
sumsquares = list1 0 plus square,
reverse = list1 ( ) postf ix I,
identity = list1 ( )list I.
list1--2. Рассмотрим случай (б):
sum = list1 0 plus I,
product = list1 1 multiply I,
append x y = list1 y list I x,
concat = list1 ( ) append I,
map f = list1 ( )list f.
Для завершения решения требуется подставить параметры
и произвести детальные вычисления. Кроме того, предпола-
гается выполнение проверки примеров.
В заключение обратим внимание на некоторые особенности мето-
да решения задачи. Прежде всего функция list1 представляет собой
функционал (и даже функтор). Определив эту функцию, на самом де-
ле выполнили значительно больший объем работы, чем требовалось.
Более конкретно, list1 проявляет существенную зависимость от па-
раметров: варьируя параметры, получаем целое семейство частных
функций, каждая из которых имеет достаточно общий вид. Тем са-
мым определение list1фиксирует понятие, или концепт. Поскольку
концепт задан описанием, то задан интенсионал. Выбирая различ-
ные значения параметров, или указывая соотнесения, на деле по-
лучаем целое семейство функций-индивидов. Перечислив элементы
этого семейства, получаем экстенсионал концепта list1.
Функции, наподобие list1, в программировании представляют
важную идею, носящую специальное название “функтор-как-объект”.
Как можно видеть, программа, составленная из таких объектов, про-
являет высокую степень общности. |