Есть ли у этой функции более высокого порядка имя?

Я вижу этот паттерн повсюду в своем коде и в библиотеках, но, кажется, нигде не могу найти его имени или абстракции.

Пример (псевдокод)

T foo( T x, void f(T&) )
{
    T y = x;
    f( y );
    return y;
}

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

Примеры из жизни (C++)

T operator+(const T& x, const T& y)
{
    T z = x; // Make a copy
    operator+=(z, y); // Modify in place
    return z;
}

Vector3 Vector3::normalized() const
{
    Vector3 x = *this; // Make a copy
    x.normalize(); // Modify in place
    return x;
}

T sorted(T const& x)
{
    T y = x; // Make a copy (yeah, yeah, could have passed by value)
    sort( y ); // Modify in place
    return y;
}

По сути, у вас есть встроенная функция (с побочными эффектами) и вы делаете из нее неуместную функцию (без побочных эффектов).

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


person Peter Alexander    schedule 16.11.2010    source источник
comment
Это очень похоже на комбинатор K   -  person SingleNegationElimination    schedule 16.11.2010
comment
Это похоже, но не то же самое. Ключевым моментом здесь является то, что f является алгоритмом in-situ, то есть f(x) мутирует x -- он ничего не возвращает.   -  person Peter Alexander    schedule 16.11.2010
comment
Скорее всего, для этого нет названия, поскольку теоретическое функциональное программирование не имеет побочных эффектов. Другими словами, это превращает недружественные функции FP в НАСТОЯЩИЕ функции (примечание: НАСТОЯЩИЕ функции не едят пирог с заварным кремом).   -  person slebetman    schedule 16.11.2010
comment
Где функции высшего порядка, о которых вы говорите?   -  person leppie    schedule 16.11.2010
comment
@slebetman: У вещей есть имена только в том, что они в FP? :)   -  person Peter Alexander    schedule 16.11.2010
comment
@leppie: foo принимает функцию в качестве аргумента, поэтому по определению это функция более высокого порядка.   -  person Peter Alexander    schedule 16.11.2010
comment
@Peter Alexander: Ах, хорошо, но ни один из примеров из реального мира этого не делает.   -  person leppie    schedule 16.11.2010
comment
@Peter: FP тесно связан с лямбда-исчислением (на самом деле где-то есть статья, в которой в основном говорится, что lisp является экземпляром лямбда-исчисления), а лямбда-исчисление - это то место, откуда берутся все имена функций.   -  person slebetman    schedule 16.11.2010
comment
@slebetman: Все имена функций взяты из лямбда-исчисления? Итак, что вы говорите, что шаблоны могут иметь имена только в том случае, если они находятся в лямбда-исчислении? Если вы этого не говорите, то я не понимаю вашей точки зрения. Это шаблон для нефункциональных языков, поэтому я не понимаю, почему его отсутствие в FP означает, что ему не разрешено имя.   -  person Peter Alexander    schedule 19.11.2010
comment
@Peter: я сказал имя функции, а не имя шаблона проектирования. Лично я не встречал ни одной функции, а не шаблона проектирования, получившего имя за пределами сообщества математики и FP. С другой стороны, шаблоны проектирования в основном называются сообществом ООП.   -  person slebetman    schedule 19.11.2010
comment
И чтобы было ясно, «все» в моем предыдущем ответе было скорее преувеличением, чем буквальным. Хотя, как я уже упоминал, я не встречал ни одной функции, получившей официальное имя за пределами сообщества математики или FP. Кроме того, ОП спросил о названии функции более высокого порядка, а не о шаблоне проектирования.   -  person slebetman    schedule 19.11.2010
comment
Скорее всего, для него нет имени, потому что это не функция более высокого порядка (у нее есть побочные эффекты — это не функция). В ООП есть термин метасообщения для сообщений, несущих другие сообщения, но копирование не очень естественно в ООП, и я все равно не знаю ни о каких шаблонах метасообщений. Если мы забудем о мутации, мы получим что-то вроде функции применения.   -  person Gabriel Ščerbák    schedule 25.06.2011


Ответы (1)


На самом деле это то, что в математике и FP называется композицией, потому что вместо этого вы можете выразить это как mystery_function(x, fun) = fun(copy(x)).

В linguo Design Patterns это оболочка, которая оборачивает вызов функции копией. Поэтому я бы скорее назвал это оберткой для копирования. Но я нигде не видел, чтобы это классифицировалось.

person Nowhere man    schedule 14.07.2011