У этой функции более высокого порядка есть имя? - PullRequest
4 голосов
/ 16 ноября 2010

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

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

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;
}

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

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

1 Ответ

1 голос
/ 15 июля 2011

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

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

...