есть ли термин для этого: func1 (func2 (), func3 ());

24

Я знаю, что obj.func1().func2()это называется метод цепочки, но что такое технический термин для:

func1(func2(), func3());

Где возврат функции используется в качестве аргумента для другой.

Женька
источник
8
obj.func1().func2() is called method chaining- Исправление: это называется крушение поезда.
Ям Маркович
Это звучит очень, очень, очень сложно, если вы не уверены, что obj.func1()всегда возвращаете объект, который имеет func2()функцию-член.
Шадур
8
@Yam Не хочешь объяснить? Это используется для большой выгоды в беглых интерфейсах, среди других. Вы имеете в виду Закон Деметры? Если это так, это не запрещает вышеуказанный паттерн, и даже в тех случаях, когда это происходит, есть хороший случай против LoD.
Конрад Рудольф
1
Метод цепочки лежит на одной полке с синтаксическим сахаром, не нужно суетиться над ним.
Кос
1
@ PauliØsterø Я думал, что это то, для чего предназначена трассировка стека.
Крис С

Ответы:

38

Я не думаю, что это функциональная композиция. Составление функций означает получение двух или более функций и превращение их в новую функцию, как f . g . hв Haskell. Обратите внимание, что в этот момент функция не вызывается.

Лично я бы func1(func2(), func3())назвал такие конструкции как «вызовы вложенных функций».

fredoverflow
источник
+1, это называется «вызовами вложенных функций» во всех контекстах программирования, которые я видел.
Изката
1
+1, называя эту «композицию функций», обманчиво неправильно.
Джан
+1. Все , что нужно f(g())сделать, это вызвать f()выражение для первого аргумента, и так случилось, что вызов функции g()квалифицируется как выражение. Но если для него должно быть название, оно настолько близко, насколько это возможно.
Blrfl
16

В математике это называется композицией функций . Я не думаю, что слышал термин, применяемый к программированию. Это может быть связано с тем, что использование по большей части избегается по нескольким причинам. Это может привести к странным ошибкам, когда функции имеют побочные эффекты, поскольку компиляторы могут свободно оценивать func3 перед func2. Отладку сложнее, потому что вы не можете установить контрольные точки или распечатать промежуточные результаты, и большинству людей просто становится труднее читать.

Карл Билефельдт
источник
4
Это называется композицией и в функциональном программировании.
Чак
8
Я не думаю, что этого "в значительной степени избегают". IMO, нередко писать код, printf("%d %d\n", strlen(a), strlen(b));а не использовать промежуточные переменные.
user281377
3
Я думаю, что решение странных ошибок, когда функции имеют побочные эффекты, состоит не в том, чтобы избежать этого, а в том, чтобы избежать написания функций, которые производят значения и имеют побочные эффекты. Точно так же, что касается отладчиков, решение должно заключаться в том, чтобы попросить лучшего отладчика, который не заставляет вас изменять свой код, чтобы заставить его работать.
Р. Мартиньо Фернандес
7
То, сможет ли компилятор оценить func3 перед func2, полностью зависит от используемого языка. Например, в Java порядок оценки строго указан. Я на самом деле подозреваю, что это относится к большинству языков.
Майкл Боргвардт
2
Термин «композиция функций» в математике фактически применяется только к функциям с одним аргументом, где он относится к структуре формы func1(func2(func3(x))). Или технически, это относится к функциям сами: если g(x) = f1(f2(f3(x))), то g( не g(x) ) является композицией f1, f2и f3. Хотя я мог видеть способ, которым вы могли бы назвать структуру в вопросе «композиция функций», мне кажется, что это весьма необычное использование термина в математическом смысле.
Дэвид З
2

Как указывает @Karl Bielefeldt, в Math это называется композицией функций.

В программировании НЕТ технического термина для этой вещи. И я думаю, что это хорошо, потому что это означает, что операция нормальная и ортогональная .

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

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

Вы можете прочитать больше об Ортогональности в Программировании в Википедии , и есть вопрос по StackOverflow по этому вопросу.

treecoder
источник
Это не указывает на ортогональность, но в зависимости от этого.
Раффаэль
+1 вы просто передаете значения, в вызове ОП нет магии
vemv
1

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

http://en.wikipedia.org/wiki/Higher-order_function

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

  • принять одну или несколько функций в качестве входа
  • вывести функцию

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

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

silverCORE
источник
1
Нет, вызов функции более высокого порядка будет выглядеть так func1(func2, func3). Обратите внимание на отсутствие круглых скобок.
fredoverflow
это имеет смысл, Фред. один - адрес функции, а другой - результат выполнения этой функции. Спасибо что подметил это.
silverCORE