是否有执行此操作的术语:func1(func2(),func3());


24

我知道这obj.func1().func2()称为方法链,但是技术术语是什么:

func1(func2(), func3());

函数的返回值用作另一个函数的参数。


8
obj.func1().func2() is called method chaining-更正:这叫做火车残骸。
Yam Marcovic

这听起来非常棘手,除非您完全确定obj.func1()总是返回具有func2()成员函数的对象。
Shadur

8
@Yam Care解释吗?它可用于流利的界面等方面,以赚取巨额利润。您指的是Demeter法则吗?如果是这样,则这并不禁止上述模式,即使在这样做的情况下,也有很好的理由反对LoD。
康拉德·鲁道夫

1
方法链接与语法糖一起放在一个架子上,无需大惊小怪。
科斯

1
@PauliØsterø我认为这就是堆栈跟踪的目的。
克里斯C

Answers:


38

我认为这不是功能组成。函数组合是指采用两个或多个函数并将其转换为新函数,就像f . g . h在Haskell中一样。请注意,此时未调用任何函数。

就个人而言,我将其func1(func2(), func3())称为“嵌套函数调用”。


+1,在我见过的所有编程上下文中都称为“嵌套函数调用”。
2011年

1
+1,称这种“功能组合”看似错误。
吉安

+1。所有f(g())要做的就是f()使用第一个参数的表达式进行调用,因此函数调用g()符合表达式的要求。但是,如果必须为它起一个名字,那就跟它的名字差不多。
Blrfl 2011年

16

在数学中,它称为函数合成。不过,我认为我没有听说过该术语适用于编程。这可能是因为出于某些原因在很大程度上避免了使用。当函数有副作用时,由于编译器可以在func2之前自由评估func3,因此它可能会引入奇怪的bug。调试起来更加困难,因为您无法设置断点或无法打印出中间结果,并且大多数人都很难理解。


4
在函数式编程中也称为合成。
查克(Chuck)

8
我认为这不是“大为避免”。IMO编写类似代码printf("%d %d\n", strlen(a), strlen(b));而不使用中间变量的情况并不少见。
2011年

3
我认为,当函数具有副作用时,解决奇怪错误的方法不是避免这种情况,而是避免编写产生值并具有副作用的函数。同样,对于调试器,解决方案应该是寻求更好的调试器,而这不会强迫您更改代码以使调试器正常工作。
R. Martinho Fernandes

7
编译器是否可以在func2之前自由评估func3,这完全取决于所使用的语言。例如,在Java中,严格指定评估顺序。我实际上怀疑大多数语言都是这种情况。
Michael Borgwardt

2
实际上,数学中的“函数组合”一词仅适用于单参数函数,它是指形式的结构func1(func2(func3(x)))。或在技术上,它指的是功能本身:如果g(x) = f1(f2(f3(x))),则g g(x))是所述组合物f1f2f3。虽然我可以看到一种可以在问题“功能组合”中称其结构的方法,但从数学意义上讲,它使我感到该术语的用法非常不寻常。
David Z

2

正如@Karl Bielefeldt指出的那样,它在数学中称为函数组合。

编程中没有专门的技术术语。而且我认为这是一件好事,因为它表示操作正常且正交

编程语言中的正交性意味着您可以使用与其上下文无关的指令/操作。例如,您可以通过以下所有方式调用函数/方法,并且其行为相同...

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

您可以在Wikipedia上的编程中阅读有关正交性的更多信息,对此有一个关于StackOverflow问题


它不是指示正交性,而是取决于正交性。
Raffael

+1您只是传递值,OP的召唤中没有魔术
vemv

1

我对术语的理解真的不好,但是几天前我刚刚读了一篇文章,它涉及术语“ 高阶函数”,这是每个Wikipedia的定义摘要:

http://en.wikipedia.org/wiki/高级订单功能

在数学和计算机科学中,高阶函数,函数形式或函数是至少执行以下一项功能的函数:

  • 接受一项或多项职能
  • 输出一个功能

所有其他功能均为一阶功能。在数学中,高阶函数也称为运算符或函数。微积分中的导数是一个常见示例,因为它会将一个函数映射到另一个函数。

因此,在这种情况下,由于这种情况确实将至少一个函数用作输入/参数,因此我认为它被认为是高阶函数。


1
不,调用高阶函数看起来像func1(func2, func3)。请注意缺少括号。
fredoverflow

弗雷德。一个是函数的地址,另一个是执行该函数的结果。感谢您指出了这一点。
silverCORE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.