【问题标题】:Does this higher order function have a name?这个高阶函数有名字吗?
【发布时间】:2010-11-16 08:22:48
【问题描述】:

我在我的代码和库中随处可见这种模式,但似乎没有我在任何地方都可以找到它的名称或抽象。

示例(伪代码)

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

基本上,您有一个就地功能(有副作用)并从中制作一个不合时宜的功能(没有副作用)。

这个模式有名字吗?您知道使用它的任何库或语言吗?显然函数式语言不会使用它,因为它们一开始就没有引用不透明的函数。

【问题讨论】:

  • 这听起来很像 K 组合子
  • 类似,但又不一样。这里的关键是 f 是一个 in-situ 算法,即 f(x) mutates x -- 它不返回任何东西。
  • 很可能没有这个名字,因为理论上的函数式编程没有副作用。换句话说,这将 FP 不友好的函数转换为 REAL 函数(注意:REAL 函数不吃乳蛋饼)
  • 你说的高阶函数在哪里?
  • @slebetman:在 FP 中只有名称? :)

标签: language-agnostic idioms generic-programming higher-order-functions


【解决方案1】:

这实际上是数学和 FP 中所谓的组合,因为您可以将其表示为 mystery_function(x, fun) = fun(copy(x))

在 Design Patterns linguo 中,它是一个包装器,用一个副本包装函数调用。所以我宁愿自然地称它为copy wrapper。但我从未在任何地方看到它被分类。

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多