高阶函数是否为函数式编程提供了更多功能?


13

在cstheory.SE上问过类似的问题。

根据关于Stackoverflow的答案,有一种算法在非惰性纯函数式编程语言上具有复杂度,而在命令式编程中,同一算法是。向FP语言添加惰性可以使算法。Ω n Ω n Ω(nlogn)Ω(n)Ω(n)

比较带有和不带有高阶函数的FP语言是否存在等效关系?它仍然是图灵完整的吗?如果是这样,那么FP缺少高阶语言是否会使该语言的“功能”或效率降低?


哪种 FP语言?
reinierpost 2012年

afaik,高阶函数和惰性评估是不一样的。那么您的问题是什么?
拉斐尔

Answers:


11

在功能足够强大的函数式编程语言(例如,使用数据类型来实现闭包)中,您可以通过反功能化的转换来消除对高阶的所有使用。由于使用了这种方法来编译这种语言,因此可以合理地假定这不会影响性能,并且在这种情况下,较高的顺序不会使该语言的功能减弱。但是,它确实会影响如何编写代码。

但是,如果语言不够强大,那么是的,高阶确实提供了表达能力。考虑一下lambda演算:没有任何高阶函数,它实际上无能为力,主要是因为最基本的数据类型(整数,布尔值)是使用函数实现的。

总之,这实际上取决于语言。


以上是我的答案。以下是有关命令式语言通常假设的评论。

关于在非惰性函数式编程语言上具有复杂度的算法,而在命令式编程中相同的算法是。向FP语言添加惰性可以使算法。Ω n Ω n Ω(nlogn)Ω(n)Ω(n)

我希望看到此参考。通常的假设是访问RAM 中长度为的数组的时间为,而纯FP中的等效项的访问时间为。这并非完全正确:RAM中的访问时间为,其中是内存的大小。当然,。实际上,访问数组元素的速度要快得多。原因是是有界的,但是...也是如此!Ô 1 ø 日志Ñ ø 日志Ñ ÑnO(1)O(logn)O(logm)mmnmn

编辑:谢谢您的链接(有关懒惰的论文的链接不可用,这里是另一个)。正如评论和我的回答中上面所述,通过提供时间查询,RAM模型对于纯FP有点不公平,即使一个地址的大小不受限制。我还不了解这个惰性技巧是如何工作的,但我认为必须注意,这仅适用于此特定问题。O(1)


4

这取决于您的表达能力。

这是一个论点,即高阶确实会增加一些东西:对于一阶语言,原始递归不足以表达Ackermann函数。但是,在存在高阶函数的情况下,原始递归就足够了:

Ackermann 0=λx.x+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

这仅使用原始递归来定义Ackermann函数。

IterIterIterNkNkIter(NN)(NN)

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.