27
ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА ПОРЯДКА Функциональное Функциональное программирование программирование Григорьева И.В. Григорьева И.В.

ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

  • Upload
    magda

  • View
    59

  • Download
    1

Embed Size (px)

DESCRIPTION

ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА. Функциональное программирование Григорьева И.В. Функционал имеет функциональный аргумент. - PowerPoint PPT Presentation

Citation preview

Page 1: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

ФУНКЦИИ БОЛЕЕ ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКАВЫСОКОГО ПОРЯДКА

Функциональное Функциональное программированипрограммировани

ееГригорьева И.В.Григорьева И.В.

Page 2: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Функционал имеет Функционал имеет функциональный аргументфункциональный аргумент

До сих пор мы рассматривали До сих пор мы рассматривали функции, которые в качестве функции, которые в качестве аргументов получали формы, аргументов получали формы, представляющие собой представляющие собой выражения, являющиеся данными. выражения, являющиеся данными. Значения функций также Значения функций также считались относящимися по типу к считались относящимися по типу к данным, т.е. выражениям, данным, т.е. выражениям, трактуемым как данные.трактуемым как данные.

Page 3: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Основываясь на едином представлении Основываясь на едином представлении данных и программ, функции в данных и программ, функции в качестве аргумента можно указать и качестве аргумента можно указать и функцию или определение функции, функцию или определение функции, либо представляющий функцию либо представляющий функцию символ. Аргумент, значением символ. Аргумент, значением которого является функция, которого является функция, называют в функциональном называют в функциональном программировании программировании функциональным функциональным аргументомаргументом, а функцию, имеющую , а функцию, имеющую функциональный аргумент - функциональный аргумент - функционаломфункционалом..

Page 4: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Если аргумент используется в Если аргумент используется в функции лишь как объект, функции лишь как объект, участвующий в вычислениях, то мы участвующий в вычислениях, то мы имеем дело с обыкновенным имеем дело с обыкновенным аргументом, представляющим аргументом, представляющим данные. Если же он используется данные. Если же он используется как средство, определяющее как средство, определяющее вычисления, т.е. играет в вычисления, т.е. играет в вычислениях, например, роль вычислениях, например, роль лямбда-выражения, которое лямбда-выражения, которое применяется к другим аргументам, применяется к другим аргументам, то мы имеем дело с функцией. то мы имеем дело с функцией.

Page 5: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

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

_(_(carcar '( '(lambdalambda ( (xx) () (list xlist x))) ))) LAMBDALAMBDA

_((_((lambdalambda ( (xx) () (list xlist x)) ')) 'carcar) ) ((CARCAR))

Page 6: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Переданное функции Переданное функции CAR CAR лямбда-лямбда-выражение не является выражение не является функциональным аргументом, и функциональным аргументом, и CAR CAR не не становится функционалом. То же самое становится функционалом. То же самое лямбда-выражение, стоящее в позиции лямбда-выражение, стоящее в позиции функции, уже интерпретируется как функции, уже интерпретируется как функция в то время, как функция в то время, как CAR CAR интерпретируется как данные. интерпретируется как данные. Функциональный аргумент и Функциональный аргумент и функционал являются некоторым функционал являются некоторым обобщением простого понятия функции: обобщением простого понятия функции: функциональным аргументом может функциональным аргументом может быть любой подходящий объект, быть любой подходящий объект, который используется в теле который используется в теле функционала в позиции функции и в функционала в позиции функции и в роли функции.роли функции.

Page 7: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Далее мы будем использовать Далее мы будем использовать понятия функции, вызова функции понятия функции, вызова функции и значения функции в следующем и значения функции в следующем смысле:смысле:

1.1. Функция Функция сама есть изображение сама есть изображение вычислений или определение.вычислений или определение.

2.2. Вызов функции Вызов функции есть применение есть применение этого изображения.этого изображения.

3.3. Значение функции Значение функции есть результат есть результат такого применения.такого применения.

Page 8: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Функция является функционалом, если в Функция является функционалом, если в качестве ее аргумента используется качестве ее аргумента используется лисповский объект типа (1), который лисповский объект типа (1), который интерпретируется как функция (2) в интерпретируется как функция (2) в теле функционала. Таким теле функционала. Таким функциональным объектомфункциональным объектом может быть может быть

1.1. символьное имя, представляющее символьное имя, представляющее определение функции (системная определение функции (системная функция или функция, определенная функция или функция, определенная пользователем),пользователем),

2.2. безымянное лямбда-выражение,безымянное лямбда-выражение,3.3. так называемое замыкание так называемое замыкание

(рассматриваемое позже).(рассматриваемое позже).

Page 9: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

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

... '(lambda (x) (list x)) ...... '(lambda (x) (list x)) ...

... (list 'lambda '(x) (list ‘list 'x)) ...... (list 'lambda '(x) (list ‘list 'x)) ...

... (first '(car cdr cons)) .... (first '(car cdr cons)) .

Page 10: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Функциональное значение Функциональное значение функциифункции

Аргументом функции может быть функция, Аргументом функции может быть функция, однако, функция может быть и результатом. однако, функция может быть и результатом. Такие функции называют функциями Такие функции называют функциями с с функциональным значениемфункциональным значением. Функционал . Функционал также может быть с функциональным также может быть с функциональным значением. Вызов такого функционала значением. Вызов такого функционала возвращает в качестве результата новую возвращает в качестве результата новую функцию, в построении которой, возможно, функцию, в построении которой, возможно, используются функции, получаемые используются функции, получаемые функционалом в качестве аргументов. Такие функционалом в качестве аргументов. Такие функционалы мы будем называть функционалы мы будем называть функционалами с функциональным значением. функционалами с функциональным значением.

Page 11: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Вызов функции с функциональным Вызов функции с функциональным значением или другая форма с значением или другая форма с функциональным значением может функциональным значением может в вызове функции находиться в в вызове функции находиться в двух различных позициях:двух различных позициях:

1.1. функционального аргумента в функционального аргумента в вызове функционала;вызове функционала;

2.2. на месте имени функции в вызове на месте имени функции в вызове функции (или функционала, или функции (или функционала, или функции с функциональным функции с функциональным значением). значением).

Page 12: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

В Коммон Лиспе предполагается, что в вызове В Коммон Лиспе предполагается, что в вызове функции на месте имени функции находится функции на месте имени функции находится символ, определенный с помощью формы символ, определенный с помощью формы DEFUN DEFUN как имя функции. Переданный в как имя функции. Переданный в качестве параметра функциональный объект качестве параметра функциональный объект можно использовать лишь через явный вызов можно использовать лишь через явный вызов применяющих функционалов (применяющих функционалов (FUNCALLFUNCALL, , APPLYAPPLY), которые мы рассмотрим. В некоторых ), которые мы рассмотрим. В некоторых других системах такого ограничения нет и в других системах такого ограничения нет и в вызове функции на месте имени функции вызове функции на месте имени функции может быть любая форма, имеющая может быть любая форма, имеющая функциональное значение. Когда именем в функциональное значение. Когда именем в вызове является атом без функциональной вызове является атом без функциональной связи, то в качестве функционального связи, то в качестве функционального объекта берется значение этого имени объекта берется значение этого имени ((SYMBOLSYMBOL--VALUEVALUE). ).

Page 13: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Способы композиции Способы композиции функцийфункций

Все типы функцийВсе типы функций могут быть могут быть использованы в определениях в использованы в определениях в следующих позициях:следующих позициях:

1.1. Обыкновенный вызов:Обыкновенный вызов:((defun f defun f ...(…...(… g g…)…)…)…)

2.2. Рекурсивный вызов:Рекурсивный вызов:((defun f defun f ...(…...(… g g…)…)…)…)

3. Вложенный рекурсивный вызов: 3. Вложенный рекурсивный вызов: ((defun f defun f ...(...(f…f…((f…)…)…)f…)…)…)

4. Функциональный аргумент: 4. Функциональный аргумент: ((defun f defun f (... (... g g ...)...)……((apply g …apply g …))……))

Page 14: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Аргументами функций были данные, Аргументами функций были данные, выражения, значением которых выражения, значением которых являются данные или, как в случае являются данные или, как в случае функций более высокого порядка, функций более высокого порядка, другие функции.другие функции.

Объединяя использование рекурсии и Объединяя использование рекурсии и функционалов, остановимся на еще функционалов, остановимся на еще одном способе использования, когда одном способе использования, когда функция принимает саму себя в функция принимает саму себя в качестве функционального аргумента:качестве функционального аргумента:

5. Рекурсивный функциональный 5. Рекурсивный функциональный аргумент: (аргумент: (defunfdefunf(...(...ff...)...)

... (... (apply fapply f... ... f f ...)...) ...)...)

Page 15: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Получающий себя в качестве аргумента Получающий себя в качестве аргумента функционал называют применяемым к функционал называют применяемым к самому себе или самому себе или автоаппликативной автоаппликативной функцией. Соответственно функцию, функцией. Соответственно функцию, возвращающую саму себя, называют возвращающую саму себя, называют авторепликативнойавторепликативной. Часто говорят и о . Часто говорят и о самовоспроизводящихся функциях.самовоспроизводящихся функциях.

Автоаппликативные и Автоаппликативные и авторепликативные функции образуют авторепликативные функции образуют класс класс автофункцийавтофункций. Автофункции на . Автофункции на самом деле не получают в качестве самом деле не получают в качестве параметра и не возвращают в качестве параметра и не возвращают в качестве результата буквально самих себя, а результата буквально самих себя, а лишь используют или копируют себя. лишь используют или копируют себя.

Page 16: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Функции более высокого Функции более высокого порядкапорядка

Представленные ранее функционалы иПредставленные ранее функционалы и функции с функциональным значением функции с функциональным значением (типы 4 и 5) в отличие от обыкновенных (типы 4 и 5) в отличие от обыкновенных функций (1, 2, 3), получающих в функций (1, 2, 3), получающих в качестве аргументов и возвращающих в качестве аргументов и возвращающих в качестве значения данные или качестве значения данные или выражения, значением которых выражения, значением которых являются данные, называются являются данные, называются функциями более высокого порядка. функциями более высокого порядка. Обыкновенные функции независимо от Обыкновенные функции независимо от того, рекурсивные они или нет, являются того, рекурсивные они или нет, являются функциями первого порядка.функциями первого порядка.

Page 17: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Функции более высокого порядка тесно Функции более высокого порядка тесно связаны с замыканиями и макросами, а связаны с замыканиями и макросами, а также с также с частичными частичными и и отложенными отложенными вычислениямивычислениями. К этим механизмам мы . К этим механизмам мы вернемся позднее.вернемся позднее.

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

Page 18: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Применяющие Применяющие функционалыфункционалы

Одним из основных типов Одним из основных типов функционалов являются функции, функционалов являются функции, которые позволяют вызывать другие которые позволяют вызывать другие функции, иными словами, применять функции, иными словами, применять функциональный аргумент к его функциональный аргумент к его параметрам. Такие функционалы параметрам. Такие функционалы называют называют применяющими применяющими или или аппликативными функционаламиаппликативными функционалами..

Page 19: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Применяющие функционалы Применяющие функционалы родственны универсальной функции родственны универсальной функции Лиспа Лиспа EVALEVAL.. В то время как В то время как EVAL EVAL вычисляет значение произвольного вычисляет значение произвольного выражения (формы), применяющий выражения (формы), применяющий функционал вычисляет значение функционал вычисляет значение вызова некоторой функции. вызова некоторой функции. Интерпретатор Лиспа ЕИнтерпретатор Лиспа ЕVAL VAL и на самом и на самом деле вызывает применяющий деле вызывает применяющий функционал функционал APPLY APPLY при вычислении при вычислении вызова, вызова, a APPLY a APPLY в свою очередь в свою очередь вызывает вызывает EVAL EVAL при вычислении при вычислении значения других форм. значения других форм.

Page 20: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Применяющие функционалы дают Применяющие функционалы дают возможность интерпретировать и возможность интерпретировать и преобразовывать данные в преобразовывать данные в программу и применять ее в программу и применять ее в вычислениях. Ниже мы рассмотрим вычислениях. Ниже мы рассмотрим применяющие функционалы применяющие функционалы интерпретатора Лиспа интерпретатора Лиспа APPLY APPLY и и FUNCALLFUNCALL, которые используются в , которые используются в программировании, управляемом программировании, управляемом данными. данными.

Page 21: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

APPLY APPLY применяет применяет функцию к списку функцию к списку

аргументоваргументовAPPLY APPLY является функцией двух является функцией двух

аргументов, из которых первый аргументов, из которых первый аргумент представляет собой аргумент представляет собой функцию, которая применяется к функцию, которая применяется к элементам списка, составляющим элементам списка, составляющим второй аргумент функции второй аргумент функции APPLYAPPLY::

((APPLY fn APPLY fn список) список) ((fn fn ''xlxl ' 'xx2 ... '2 ... 'xNxN)),,где список=(х1 где список=(х1 xx2 ... 2 ... xNxN) )

Page 22: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

_(apply _(apply '+ '(2 3))'+ '(2 3))55

__((applyapply ' 'cons cons '(что'(что)) ‘(‘(пожелаетепожелаете))))(ЧТО ПОЖЕЛАЕТЕ)(ЧТО ПОЖЕЛАЕТЕ)

_(setq f _(setq f ‘‘ +)+)++

_(apply f _(apply f '(2 3))'(2 3))5 5 _(_( apply 'apply '(+ apply 'apply '(+ 2 3)))2 3)))55_(apply ‘(lambda (x y) _(apply ‘(lambda (x y) (+ (+ x x у)) у)) '(2 3))'(2 3))55

Page 23: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

FUNCALL FUNCALL вызывает функцию вызывает функцию с аргументами с аргументами

Функционал Функционал FUNCALL FUNCALL по своему действию по своему действию аналогичен аналогичен APPLYAPPLY, но аргументы для , но аргументы для вызываемой функции он принимает не вызываемой функции он принимает не списком, а по отдельности:списком, а по отдельности:

((FUNCALL fnxt xFUNCALL fnxt x2 ... 2 ... xNxN) ) ((fn x1 xfn x1 x2 ... 2 ... xNxN))Приведем пример:Приведем пример:_(funcall _(funcall '+2 3)'+2 3)55

Page 24: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

_(_(setq setq сложение '+)сложение '+)++_(_(funcall funcall сложение 2 3)сложение 2 3)55_(funcall_(funcall ( (car car '(+'(+ -- ** /)) 2 3)/)) 2 3)55

Page 25: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Таким образом появляется возможность Таким образом появляется возможность использовать использовать синонимы синонимы имени имени функции. С другой стороны, имя функции. С другой стороны, имя функции можно использовать как функции можно использовать как обыкновенную переменную, например обыкновенную переменную, например для хранения другой функции (имени для хранения другой функции (имени или лямбда-выражения), и эти два или лямбда-выражения), и эти два смысла (значение и определение) не смысла (значение и определение) не будут мешать друг другу:будут мешать друг другу:

_(setq cons '+)_(setq cons '+)_(funcall cons 2 3) _(funcall cons 2 3) 5 5 _(cons 2 3)_(cons 2 3) (2 (2 . 3). 3)

Page 26: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

Поскольку первый аргумент Поскольку первый аргумент функционала функционала FUNCALL FUNCALL вычисляется вычисляется по обыкновенным правилам, то на его по обыкновенным правилам, то на его месте должно стоять выражение, месте должно стоять выражение, значением которого будет значением которого будет функциональный объект. функциональный объект. Функциональным аргументом может Функциональным аргументом может быть только "настоящая" функция. быть только "настоящая" функция. Такие специальные формы, как Такие специальные формы, как QUOTE и SETQ, либо рассматриваемые QUOTE и SETQ, либо рассматриваемые позже макросы для этого не позже макросы для этого не подходят, даже если бы их значением подходят, даже если бы их значением был функциональный объект. был функциональный объект.

Page 27: ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА

УпражненияУпражнения1.1. Вычислите значения следующих Вычислите значения следующих

вызовов:вызовов:(apply ‘list '((apply ‘list '(аа b)) b))(funcall ‘list '((funcall ‘list '(аа b)) b))(funcall 'apply ‘list '((funcall 'apply ‘list '(аа b)) b))(funcall ‘list 'apply '(a b))(funcall ‘list 'apply '(a b))(funcall 'funcall 'funcall ‘list ‘list '(a b))(funcall 'funcall 'funcall ‘list ‘list '(a b))

2.2. Определите Определите FUNCALL FUNCALL через через функционал функционал APPLYAPPLY. .