代码之家  ›  专栏  ›  技术社区  ›  Peter Alexander

这个高阶函数有名字吗?

  •  4
  • Peter Alexander  · 技术社区  · 14 年前

    我在代码中到处看到这种模式,而在库中,它似乎没有任何名称或抽象,我在任何地方都能找到。

    示例(伪代码)

    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 回复  |  直到 14 年前
        1
  •  1
  •   Nowhere man    13 年前

    实际上,这在数学和fp中被称为作文,因为你可以把它表达为 mystery_function(x, fun) = fun(copy(x)) 反而。

    在设计模式语言中,它是一个包装器,用副本包装函数调用。所以我宁愿自然地称之为 拷贝包装器 . 但我从没在任何地方见过它的机密。