~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 588871E463C0B0B90727B3A327984AFB__1715830620 ✰
Заголовок документа оригинал.:
✰ Function composition (computer science) - Wikipedia ✰
Заголовок документа перевод.:
✰ Композиция функций (информатика) — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Function_composition_(computer_science) ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/58/fb/588871e463c0b0b90727b3a327984afb.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/58/fb/588871e463c0b0b90727b3a327984afb__translat.html ✰
Дата и время сохранения документа:
✰ 16.06.2024 09:08:39 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 16 May 2024, at 06:37 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Композиция функций (информатика) — Википедия Jump to content

Функциональная композиция (информатика)

Из Википедии, бесплатной энциклопедии

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

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

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

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

Составление вызовов функций [ править ]

Например, предположим, что у нас есть две функции f и g , как в z = f ( y ) и y = g ( x ) . Их составление означает, что мы сначала вычисляем y = g ( x ) , а затем используем y для вычисления z = f ( y ) . Вот пример на языке C :

плавать   x  ,   y  ,   z  ; 
  // ... 
 y   =   g  (  x  ); 
  z   знак равно   ж  (  у  ); 

Шаги можно объединить, если не давать имя промежуточному результату:

z   знак равно   ж  (  г  (  Икс  )); 

Несмотря на различия в длине, эти две реализации вычисляют один и тот же результат. Вторая реализация требует только одной строки кода и в просторечии называется «сложно составленной» формой. Читабельность и, следовательно, удобство сопровождения является одним из преимуществ сложных форм, поскольку они требуют меньше строк кода, что минимизирует «поверхность» программы. [1] ДеМарко и Листер эмпирически подтверждают обратную зависимость между площадью поверхности и ремонтопригодностью. [2] С другой стороны, возможно злоупотребление сложными формами. Вложенность слишком большого количества функций может иметь противоположный эффект, делая код менее удобным в сопровождении.

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

подруга
 

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

Именование состава функций [ править ]

Теперь предположим, что комбинация вызова f() по результату g() часто оказывается полезной, и мы хотим назвать ее foo(), чтобы использовать ее как самостоятельную функцию.

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

float   foo  (  float   x  )   { 
     return   f  (  g  (  x  )); 
  } 

(длинная форма с промежуточными элементами также подойдет.) Пример на Форте :

  :фу подруга ;
 

В таких языках, как C , единственный способ создать новую функцию — это определить ее в исходном коде программы, а это означает, что функции не могут быть составлены во время выполнения . оценка произвольного состава предопределенных Однако возможна функций:

#include   <stdio.h> 

 typedef   int   FXN  (  int  ); 

  int   f  (  int   x  )   {   return   x  +  1  ;    } 
 Int   g  (  int   x  )   {   return   x  *  2  ;    } 
 Int   h  (  int   x  )   {   return   x  -3  ;    } 

 int   eval  (  FXN   *  fs  [],   int   size  ,   int   x  ) 
 { 
    for   (  int   i  =  0  ;   i  <  size  ;   i  ++  )   x   =   (  *  fs  [  i  ])(  x  ); 

     вернуть   х  ; 
  } 

 int   main  () 
 { 
    // ((6+1)*2)-3 = 11 
    FXN   *  arr  []   =   {  f  ,  g  ,  h  }; 
     printf  (  "%d  \n  "  ,   eval  (  arr  ,   3  ,   6  )); 

     // ((6-3)*2)+1 = 7 
    arr  [  2  ]   =   f  ;     обр  [  0  ]   знак равно   час  ; 
     printf  (  "%d  \n  "  ,   eval  (  arr  ,   3  ,   6  )); 
  } 

Первоклассный состав [ править ]

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

Хаскелл [ править ]

В Haskell пример foo = f g приведенный выше выглядит следующим образом:

фу = е.  г
 

используя встроенный оператор композиции (.), который можно прочитать как f после g или g, составленный с помощью f .

Сам оператор композиции можно определить в Haskell с помощью лямбда-выражения :

(  .  )   ::   (  b   ->   c  )   ->   (  a   ->   b  )   ->   a   ->   c 
 f   .    г   знак равно   \  Икс   ->   ж   (  г   Икс  ) 

Первая строка описывает тип (.) — он принимает пару функций f , g и возвращает функцию (лямбда-выражение во второй строке). Обратите внимание, что Haskell не требует указания точных типов ввода и вывода f и g; a, b, c и x — заполнители; имеет значение только отношение между f и g (f должно принять то, что возвращает g). Это делает (.) полиморфным оператором.

Лисп [ править ]

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

(  define   (  compose   .   fs  ) 
   (  if   (  null?   fs  )   (  лямбда   (  x  )   x  )   ; если аргумент не указан, вычисляется тождественная функция 
       (  лямбда   (  x  )   ((  car   fs  )   ((  apply   compose   (  cdr   fs  ))   Икс  ))))) 

 ;   примеры 
 (  define   (  add-a-bang   str  ) 
   (  string-append   str   "!"  )) 

 (  define   Givebang 
   (  составить   строку->символ   add-a-bang   символ->строка  )) 

 (  Givebang   'set  )   ;   ===> установил! 

  ;   анонимная композиция 
 ((  compose   sqrt   negate   Square  )   5  )   ;   ===> 0+5i 

АПЛ [ править ]

Многие диалекты APL имеют встроенную композицию функций с использованием символа . Эта функция высшего порядка расширяет композицию функций до диадического применения левой функции, так что A f∘g B является A f g B.

foo f g 

Кроме того, вы можете определить состав функций:

o { ⍺⍺  ⍵⍵  } 

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

  р  (  ж   о   г  )  Икс 
   р  ж   г   Икс 

Раку [ править ]

Raku, как и Haskell, имеет встроенный оператор композиции функций, основное отличие состоит в том, что он пишется как или o.

мой   &  foo   =   &  f    &  g  ; 

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

# реализация здесь имеет немного другую строку, потому что она обманывает 
 прото   -   инфикс  :<∘> (&?, &?) is equiv(&[~]) is assoc<left> {  *  } 

 multi   sub-   инфикс  :<∘> ( ) {   *.   self   }   # позволяет `[∘] @array` работать, когда `@array` пуст, 
 multi   sub   infix  :<∘> (&f) {   &  f   }     # позволяет `[∘] @array` работать, когда `@array` имеет один элементный 
 мультиподинфикс   > (&f, &   :< ∘  g --> Block) { 
     (  &  f  )  .   кол   >   1 
     ??    ->   |   аргументы   {   ж   |   г   |   аргументы   } 
     !!    ->   |   аргументы   {   ж   г   |   args   } 
 } 

 # присвоить ему псевдоним написания "Техас" (все больше, и ASCII в Техасе) 
 my   &  infix:  <o>   :  =   &  infix:  <∘>  ; 

Nim [ edit ]

Nim поддерживает единый синтаксис вызова функций , что позволяет создавать произвольную композицию функций через синтаксис метода. . оператор. [3]

func   foo  (  a  :   int  ):   string   =   $  a 
 func   bar  (  a  :   string  ,   count  :   int  ):   seq  [  string  ]   = 
   for   i   in   0   ..  <   count  : 
     result  .   add  (  a  ) 
 func   baz  (  a  :   seq  [  строка  ]  )   = 
   for   i   in   a  : 
     echo   i 

 # эквивалент! 
  эхо   фу  (  5  ).   бар  (  6  ).   baz  () 
 echo   baz  (  bar  (  6  ,   foo  (  5  ))) 

Питон [ править ]

В Python способ определения композиции для любой группы функций — использование функции сокращения (используйте functools.reduce в Python 3):

# Доступно начиная с Python v2.6 
 из   functools   import   сокращение 
 от   ввода   import   Callable 

 def   compose  (  *  funcs  )   ->   Callable  [[  int  ],   int  ]: 
     """ Составьте группу функций (f(g(h(...) )))) в одну составную функцию.""" 
     return   уменьшить  (  лямбда   f  ,   g  :   лямбда   x  :   f  (  g  (  x  )),   funcs  ) 

 # Пример 
 f   =   лямбда   x  :   x   +   1 
 g   =   лямбда   x  :   x   *   2 
 h   =   лямбда   x  :   x   -   3 

 # Вызов функции x=10 : ((x-3)*2)+1 = 15 
 print  (  compose  (  f  ,   g  ,   h  )(  10  )) 

JavaScript [ править ]

В JavaScript мы можем определить его как функцию, которая принимает две функции f и g и создает функцию:

function   o  (  f  ,   g  )   { 
     return   function  (  x  )   { 
         return   f  (  g  (  x  )); 
      } 
 } 

 // В качестве альтернативы можно использовать оператор rest и лямбда-выражения в ES2015 
 const   compose   =   (...  fs  )   =>   (  x  )   =>   fs  .   уменьшитьRight  ((  Acc  ,   f  )   =>   f  (  Acc  ),   x  ) 

С# [ править ]

В C# мы можем определить его как метод расширения, который принимает Funcs f и g и создает новый Func:

// Пример вызова: 
 // var c = f.ComposeWith(g); 
  // 
 // Func<int, bool> g = _ => ... 
 // Func<bool, string> f = _ => ... 

 public   static   Func  <  T1  ,   T3  >   ComposeWith  <  T1  ,   T2  ,   T3  >  (  это   Func  <  T2  ,   T3  >   f  ,   Func  <  T1  ,   T2  >   g  )   =>   x   =>   f  (  g  (  x  )); 

Руби [ править ]

Такие языки, как Ruby, позволяют вам самостоятельно создавать бинарный оператор:

class   Proc 
   def   compose  (  other_fn  ) 
     ->  (  *  as  )   {   other_fn  .   вызов  (  вызов  (  *  as  ))   } 
   end 
   alias_method   :+  ,   :compose 
 end 

 f   =   ->  (  x  )   {   x   *   2   } 
 g   =   ->  (  x  )   {   x   **   3   } 
 (  f   +   g  )  .   позвони  (  12  )   # => 13824 

Однако в Ruby 2.6 появился собственный оператор композиции функций: [4]

е   =   процесс  {  |   х  |    х   +   2  } 
 г   =   процесс  {  |   х  |    Икс   *   3  } 
 (  ж   <<   г  )  .   вызов  (  3  )   # -> 11;   идентично f(g(3)) 
 (  f   >>   g  )  .   вызов  (  3  )   # -> 15;   идентично g(f(3)) 

Исследование [ править ]

Понятия композиции, включая принцип композиционности и композиционности , настолько распространены, что отдельные направления исследований развивались отдельно. Ниже приводится выборка исследований, в которых понятие композиции занимает центральное место.

Масштабная композиция [ править ]

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

Императивные процедуры с побочными эффектами нарушают ссылочную прозрачность и поэтому не могут быть полностью компонуемы. Однако если рассматривать «состояние мира» до и после запуска кода как его входные и выходные данные, можно получить чистую функцию. Состав таких функций соответствует последовательному запуску процедур. использует Формализм монады эту идею для включения побочных эффектов и ввода/вывода (I/O) в функциональные языки.

См. также [ править ]

Примечания [ править ]

  1. ^ Кокс (1986) , стр. 15–17.
  2. ^ ДеМарко и Листер (1995) , стр. 133–135.
  3. ^ «Руководство Nim: Синтаксис вызова методов» . nim-lang.org . Проверено 17 августа 2023 г.
  4. ^ «Выпущен Ruby 2.6.0» . www.ruby-lang.org . Проверено 4 января 2019 г.
  5. ^ Раймонд (2003)

Ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 588871E463C0B0B90727B3A327984AFB__1715830620
URL1:https://en.wikipedia.org/wiki/Function_composition_(computer_science)
Заголовок, (Title) документа по адресу, URL1:
Function composition (computer science) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)