Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225

"Функции более высокого порядка. Функциональный аргумент, функциональное значение. Способы композиции функций" - композиции и функции высокого порядка

30.08.2013, 23:46. Показов 4959. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Идут 2 вопроса подряд:
"Локальные определения (форма LET).
Функции более высокого порядка. Функциональный аргумент, функциональное значение. Способы композиции функций."
Что имеется в виду под "функциями более высокого порядка" и "способами композиции функций" ? Предполагаю, что последнее - это "композиции функционалов", но я не понимаю, что имеется в виду под этим выражением.

Может полный список вопросов поможет прояснить что-нибудь насчет "высоких порядков".
Список вопросов

1. Базовые функции обработки списков.
2. Определение и вызов функций с помощью λ-выражений. λ-список, λ-преобразование. Свободные и связанные переменные. Функция DEFUN
3. Локальные определения (форма LET).
4. Функции более высокого порядка. Функциональный аргумент, функциональное значение. Способы композиции функций.
5. Автоматическое управление памятью в Лиспе. «Сборка мусора».
6. Создайте Лисп-список, представляющий собой список планет Солнечной системы.
7. Почему значения в Лиспе представлены указателями?
8. Определите функцию add5(n), которая увеличивает числовой параметр n на 5.
9. Определите функцию add5(n), которая увеличивает числовой параметр n на 5, используя синтаксис λ-определения.
10. Суперпозиция (или «композиция») функций как средство формирования более сложных функций.
11. Какую (двоякую) роль играет в Лиспе функция eval?
12. Возвращение функцией нескольких величин.
13. Базовые функции Лиспа.
14. Опишите три варианта предиката равенства в Лиспе.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.08.2013, 23:46
Ответы с готовыми решениями:

Бесконечно малые функции более высокого порядка малости
Здравствуйте! Есть задание указать бесконечно малые функции b(x) более высокого порядка малости, чем a(x) = x при x-->0. ...

Функции высокого порядка
Всем привет, вопрос будет более к синтаксису, нежели к понимаю самой темы. Возьмём простую функцию, к примеру: sum1::Integer...

Каким образом можно использовать функции высокого порядка
Помогите пожалуйста ответить на вопрос. Каким образом можно использовать функции высокого порядка (аргументами функций являются...

16
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
31.08.2013, 21:44
Если просто: функциональный аргумент - это аргумент функции, который сам является функцией. Например,
функционал mapcar (при самом простом способе применения) требует два аргумента: функцию и список. mapcar применяет свой аргумент к каждому элементу списка, а из полученных результатов строит список-результат.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;; функциональный аргумент - лямбда выражение,
;; прибавляющее к своему аргументу 5
 
(mapcar #'(lambda (x) (+ x 5)) '(1 2 3 4 5)) 
 
==> (6 7 8 9 10)
 
;; oddp - предикат, возвращающий истину или ложь, в зависимости от 
;; нечетности аргумента
 
(mapcar #'oddp '(1 2 3 4 5))
 
==> (T NIL T NIL T)
 
;; а это вычисление факториала каждого эл-та списка
 
(mapcar #'fact '(1 2 3 4 5))
 
==> (1 2 6 24 120)
Добавлено через 14 минут
О функциональном значении говорят, когда функция возвращает результат, который сам является функцией. Вот пример (HomeLisp), но будет работать и в Common Lisp:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun multer (x)   ;; функция, возвращающая лямбда-выражение (точнее, замыкание)
  (lambda (y) (* x y)))
 
==> multer
 
;; порождаем два "умножителя": *3 - умножитель на 3 и *11 - умножитель на 11 
 
(setq *3 (multer 3) *11 (multer 11))  
 
==> (CLOSURE (y) ((* x y)) ((x 11)))
Создана глобальная переменная *3
Создана глобальная переменная *11
 
(funcall *3 5)   ;; проверяем 
 
==> 15
 
(funcall *11 5) ;; проверяем
 
==> 55
Здесь мы связали порожденные функции с переменными. Но так делать не обязательно. Вот пример:

Lisp
1
2
3
(funcall (multer 12) (+ 3 5))  ;; здесь возникает функция умножения на 12 и сразу же используется
 
==> 96
Переменная, использующаяся в лямбда-выражении, но не входящая в его список аргументов, называется свободной (а входящая - связанной). Посмотрим на наш multer: x - свободная переменная, а y - связанная.
2
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
31.08.2013, 22:18  [ТС]
С функциональными аргументами понятно. А в остальном, простите, ничего не понял.

Цитата Сообщение от Catstail Посмотреть сообщение
функция возвращает результат, который сам является функцией
1. Не понял как результат функции может быть функцией.
2. Что такое умножитель?
3. И что делает CLOSURE? Почитал про замыкания, но насколько я понял, это просто глобальные переменные, использующиеся в функции.
"Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции/" :
Lisp
1
2
(SETQ z 1)
(DEFUN foo (x y) (SETQ z (^ x y)))
Переменная z объявлена вне функции foo, и получается, что foo является замыканием. А про CLOSURE в Лиспе не нашел ничего определенного.
4. Про свободные и связанные переменные ясно, но к чему это?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
31.08.2013, 22:36
Начну с конца:
4. Свободные и связанные переменные - это вопрос из твоего-же списка (№2)

3. Теперь про замыкание. Нет, это не просто "глобальные переменные, использующиеся в функции". Замыкание - это функция, с зафиксированными (на момент вызова) значениями свободных переменных.

2. Я назвал функцию multer (умножитель). Взглянем на нее еще раз:

Lisp
1
2
(defun multer (x) 
  (lambda (y) (* x y)))
Что будет, если вызвать функцию так:
Lisp
1
(multer 7)
Функция вернет (lambda (y) (* 7 y)) Возражения есть? А что такое (lambda (y) (* 7 y))? Это безымянная функция с аргументом y и результатом 7*y. Вот так функция (multer) может возвращать другую функцию.

Добавлено через 4 минуты
Ну, и локальное определение (LET). Это способ создания локальных переменных:

Lisp
1
2
3
(Let ((x 1) (y 2)) 
    (print (+ x y)))  ;; напечатает 3
(print (+ x y)) ;; будет ошибка, т.к. переменные x и y вышли из области определения
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
31.08.2013, 23:01  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Замыкание - функция с зафиксированными (на момент вызова) значениями свободных переменных.
Что имеется в виду под зафиксированными значениями?
Цитата Сообщение от Catstail Посмотреть сообщение
Функция вернет (lambda (y) (* 7 y)). Возражения есть?
Мой мозг не может справиться с этим. Никогда не видел, чтобы внутри функции определялась функция. Но возражений вроде нет.
Хорошо, тогда что это значит: "(setq *3" ? На месте звезды с тройкой обычно стоит переменная, и запись кажется странной.

Добавлено через 17 минут
Можете еще на вопрос из списка ответить, пожалуйста?
"7. Почему значения в Лиспе представлены указателями?"
Нашел только это:
"Все значения в Common Lisp, по крайней мере концептуально, являются ссылками на объекты4). Поэтому присваивание переменной нового значения изменяет то, на какой объект ссылается переменная (то есть, куда ссылается переменная), но не оказывает никакого влияния на объект, на который переменная ссылалась ранее. Однако, если переменная содержит ссылку на изменяемый объект, вы можете использовать данную ссылку для изменения этого объекта, и это изменение будет видимо любому коду, который имеет ссылку на этот же объект.
Один из способов введения новой переменной вы уже использовали при определении параметров функции. Как вы видели в предыдущей главе, при определении функции с помощью DEFUN список параметров определяет переменные, которые будут содержать аргументы, переданные функции при вызове. Например, следующая функция определяет три переменные для хранения своих аргументов: x, y и z.
(defun foo (x y z) (+ x y z))
При каждом вызове функции, Lisp создает новые привязки (bindings) для хранения аргументов, переданных при вызове этой функции. Привязка является проявлением переменной во время выполнения. Отдельная переменная — сущность, на которую вы можете сослаться в исходном коде своей программы — может иметь множество различных привязок за время выполнения программы. Отдельная переменная даже может иметь множество привязок в одно и то же время: параметры рекурсивной функции, например, связываются заново (rebound) при каждом вызове этой функции."
Но ответа на вопрос "почему" текст выше не дает.
0
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
31.08.2013, 23:02
Из книги "Основы функционального программирования." Лидия Васильевна Городняя.
Lisp
1
2
3
4
5
6
;Конструктор суперпозиции функций.
(defun super (f g) #'(lambda (x) (funcall f (funcall g x))))
 
;применение суперпозиции CAR и CDR.
> (funcall (super #'car #'cdr) '(1 2 3))
2
Там на эту тему еще много.

umc55555
Вопрос. А откуда эти задания? Сами учите, или преподают?
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
31.08.2013, 23:06  [ТС]
Цитата Сообщение от Lambdik Посмотреть сообщение
А откуда эти задания? Сами учите, или преподают?
Вопросы к зачету. Можно считать, что сам учу).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
31.08.2013, 23:16
На последний вопрос ответить совсем просто: *3 - это атом Лиспа (символ), который может быть имененм переменной!

А с первым вопросом я немного виноват. Правильнее сказать - но момент определения. Посмотрим еще раз на multer:

Lisp
1
2
(defun multer (x) 
  (lambda (y) (* x y)))
Переменная x свободна (относительно лямбда-выражения). multer можно вызывать много раз с разными x. И будут возвращаться разные замыкания. В HomeLisp результат выводится в виде

Lisp
1
(CLOSURE (y) ((* x y)) ((x 11)))
Это та же функция (только заголовок CLOSURE). У нее аргумент y, тело - (* x y), а значение свободной переменной зафиксировано (и в данном случае = 11).

Другой способ создать замыкание - определить обычную функцию в теле let:

Lisp
1
2
3
4
(defun f1 (x) (+ x c))
 
(let ((c 5))
   (defun f2 (x) (+ x c))
Функция f1 работать не будет (т.к. значение переменной с неопределено). Функция f2 работать будет:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(defun f1 (x) (+ x c))
 
==> f1
 
(f1 4)
 
Assoc: Символ c не имеет значения (не связан).
==> ERRSTATE
 
(let ((c 5))
   (defun f2 (x) (+ x c)))
 
==> f2
 
(f2 4)
 
==> 9 ;; 4+5=9
 
(setq c 7)  ;; определим ГЛОБАЛЬНУЮ переменную
 
==> 7
Создана глобальная переменная c
 
(f2 4)
 
==> 9  ;; по-прежнему видит локальную переменную из замыкания
 
(f1 4)
 
==> 11 ;; видит глобальную
Добавлено через 3 минуты
"Почему значения в Лиспе представлены указателями?" - я бы ответил вопросом на вопрос: а чем их можно еще представить в Лиспе?
2
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
01.09.2013, 14:24  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
"Почему значения в Лиспе представлены указателями?" - я бы ответил вопросом на вопрос: а чем их можно еще представить в Лиспе?
Ну, например, область памяти, значение в которой можно изменять в ходе выполнения программы. Почему нет? Как, например, в C# или C++, насколько мне известно.

С остальным вроде понятно.
Даже способы композиций нашел.
1. Обыкновенный вызов:
(defun f ...(… g…)…)
2. Рекурсивный вызов:
(defun f ...(… f…)…)
3. Вложенный рекурсивный вызов:
(defun f ...(f…(f…)…)…)
4. Функциональный аргумент:
(defun f (... g ...)
…(apply g …)…)
5. Рекурсивный функциональный аргумент: (defunf(...f...)
... (apply f... f ...)...)
И еще, может у кого-то есть на примете ссылка на хорошую статью про "5. Автоматическое управление памятью в Лиспе. Сборка мусора." ?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
01.09.2013, 15:54
"Автоматическое управление памятью в Лиспе. Сборка мусора." - рискну предложить вот это
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
01.09.2013, 16:00  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
рискну предложить вот это
Спасибо, не заметил))).

Добавлено через 33 секунды
А насчет указателей?
Цитата Сообщение от umc55555 Посмотреть сообщение
Цитата Сообщение от Catstail Посмотреть сообщение
"Почему значения в Лиспе представлены указателями?" - я бы ответил вопросом на вопрос: а чем их можно еще представить в Лиспе?
Ну, например, область памяти, значение в которой можно изменять в ходе выполнения программы. Почему нет?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
01.09.2013, 16:14
Почему в Лиспе значения есть адреса. Если бы значения являлись бы самими объектами, то их передача/возврат из функций требовала бы громадного стекового пространства... Кстати, и в C/С++ передача объекта по значению требует заметно бОльших ресурсов - и стековое пространство, и лишние вызовы конструкторов/деструкторов и т.д.
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
01.09.2013, 16:21  [ТС]
Если переменные - области памяти, то каждый раз при нужде выделяется новая область памяти под новую переменную. Если переменные - указатели, то каждый раз при нужде указатель показывает на новую область памяти.
Как-то так, хоть и немного корявые формулировки. По идее получается, что память одинаково используется что там, что там.
Вот с конструкторами и деструкторами - это вариант.
А насчет стекового пространства не очень ясно. Можно какой-нибудь простенький пример, пожалуйста?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
01.09.2013, 16:28
"По идее получается, что память одинаково используется что там, что там." - совершенно верно.
Теперь о стеке. Как осуществляется передача по значению чего-либо более сложного, чем простая переменная.

1) создается копия этого "чего-либо"
2) в вызывающую функцию передается адрес копии

теперь вопрос: где создавать копию? Самое правильное место - в стеке! (При возврате память автоматически освободится)
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
01.09.2013, 16:37  [ТС]
Точно. Отлично, большое спасибо.
P. S. * не нашел
Цитата Сообщение от umc55555 Посмотреть сообщение
не заметил
Добавлено через 9 минут
"Привязка является проявлением переменной во время выполнения."
Можно еще маленький вопрос.. Что значит "проявление переменной во время выполнения" ? Слово "проявление" напрягает.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,684
Записей в блоге: 14
01.09.2013, 16:39
Цитата Сообщение от umc55555 Посмотреть сообщение
Слово "проявление" напрягает.
- это совершенно явный огрех перевода
1
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 225
01.09.2013, 22:05  [ТС]
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2013, 22:05
Помогаю со студенческими работами здесь

Как правильно задать функцию Бесселя с поправочными членами более высокого порядка
Ребят, как правильно задать функцию Бесселя с поправочными членами более высокого порядка. график должен стать более изрезанным

Определение арности предикатов более низкого порядка при использовании предикатов более высокого
Меня интересует нечто в этом роде: \mathrm{QP:AnotherPredicate(P)} \to \mathrm{Unary(P)}, Q — некоторый квантор. Суть в том,...

Рекурсия высокого порядка
Необходимо сделать с помощью рекурсии высокого порядка реверс списка на всех уровнях. У меня получилось только на 1 уровне, дальше не могу...

Функция высокого порядка
Доброго времени суток. Есть 2 лабы, требующие решения! Помогите, пожалуйста! 1. Выдавать отсортированный в порядке...

Линейное уравнение высокого порядка
Помогите с решением,пожалуйста. y''''''+64y=0


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru