函数式编程中的函数应用背后的机制是什么

时间:2018-07-16 19:15:37

标签: functional-programming

好的,让我尝试重新表达我的问题。

实际上,我想知道FP中如何实现功能应用程序。

这是否像命令式语言中的函数调用一样完成,在每次调用中都添加了堆栈框架,并在每次返回时将其删除。

或者,就像内联函数中那样,其中函数调用语句被函数定义替换了。

另外,就功能应用程序的实现而言,语句 FP中的功能的意义是域与相应范围之间的映射。显然,不可能为每个域范围的条目对维持一个 mapping ,因此该语句的确切含义是……

1 个答案:

答案 0 :(得分:1)

这个问题范围很广,我无法完全回答,因为我不知道每种功能编程语言。但是我可以告诉您它是如何使用一种语言(F#)完成的。您问函数应用程序是否像命令式语言中的函数调用一样完成(每次调用都添加了另一个堆栈框架),还是作为内联函数完成了……在F#中,答案都是都是。允许F#编译器选择是创建使用堆栈框架的函数调用,还是在调用站点内联该函数。通常,根据编译函数的大小进行选择。如果函数编译到少于N个字节的已编译代码(我无法告诉您确切的数字,但是知道确切的数字实际上并不重要),则编译器通常会内联该函数调用;如果占用的字节数超过N个,则函数调用将使用堆栈帧。 (除非是尾递归调用,它们被编译为与goto等效,并且不使用堆栈框架)。

P.S。您可以使用inline关键字来强制编译器,这会强制该函数每次都在调用站点内联。大多数F#程序员不建议您定期执行此操作,因为编译器足够聪明,因此通常不建议重写其决策。 (此外,inline关键字意味着函数参数的类型必须在编译时即可解析,因此有些函数会更改语义,但是对于您所问的问题来说这有点偏离主题了。除了在F#中,静态解析类型参数或SRTP是一个非常复杂的主题,如果您理解它们,可以对它们进行一些非常高级的事情。)