4

我在代码和库中的任何地方都能看到这种模式,但似乎没有任何名称或抽象,我可以在任何地方找到它。这个高阶函数是否有名字?

实施例(伪代码)

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

基本上,你有一个到位函数(副作用),使外的地方的功能(无副作用)出来的。

这种模式是否有名称?你知道任何使用它的图书馆或语言吗?很明显,函数式语言不会使用它,因为它们不具有起始的不透明函数。

+0

这听起来很像K combinator – SingleNegationElimination 2010-11-16 08:37:01

+0

它很相似,但不一样。这里的关键是'f'是一个* in-situ *算法,即'f(x)'*变异*'x' - 它不返回任何东西。 – 2010-11-16 09:15:46

+5

由于理论函数式编程没有副作用,因此很可能没有这个名称。换句话说,这种变换FP不友好的功能变成REAL功能(注意:REAL功能不会吃乳蛋饼) – slebetman 2010-11-16 10:17:14

回答

1

它实际上在数学和FP中被称为构图,因为您可以将其表示为mystery_function(x, fun) = fun(copy(x))

在Design Patterns中,它是一个包装函数,它将函数调用与一个副本包装在一起。所以我宁愿自然地称它为复制包装。但我从来没有看到它在任何地方分类