我在cstheory.SE上问过类似的问题。
根据关于Stackoverflow的答案,有一种算法在非惰性纯函数式编程语言上具有复杂度,而在命令式编程中,同一算法是。向FP语言添加惰性可以使算法。Ω (n )Ω (n )
比较带有和不带有高阶函数的FP语言是否存在等效关系?它仍然是图灵完整的吗?如果是这样,那么FP缺少高阶语言是否会使该语言的“功能”或效率降低?
我在cstheory.SE上问过类似的问题。
根据关于Stackoverflow的答案,有一种算法在非惰性纯函数式编程语言上具有复杂度,而在命令式编程中,同一算法是。向FP语言添加惰性可以使算法。Ω (n )Ω (n )
比较带有和不带有高阶函数的FP语言是否存在等效关系?它仍然是图灵完整的吗?如果是这样,那么FP缺少高阶语言是否会使该语言的“功能”或效率降低?
Answers:
在功能足够强大的函数式编程语言(例如,使用数据类型来实现闭包)中,您可以通过反功能化的转换来消除对高阶的所有使用。由于使用了这种方法来编译这种语言,因此可以合理地假定这不会影响性能,并且在这种情况下,较高的顺序不会使该语言的功能减弱。但是,它确实会影响如何编写代码。
但是,如果语言不够强大,那么是的,高阶确实提供了表达能力。考虑一下lambda演算:没有任何高阶函数,它实际上无能为力,主要是因为最基本的数据类型(整数,布尔值)是使用函数实现的。
总之,这实际上取决于语言。
以上是我的答案。以下是有关命令式语言通常假设的评论。
关于在非惰性函数式编程语言上具有复杂度的算法,而在命令式编程中相同的算法是。向FP语言添加惰性可以使算法。Ω (n )Ω (n )
我希望看到此参考。通常的假设是访问RAM 中长度为的数组的时间为,而纯FP中的等效项的访问时间为。这并非完全正确:RAM中的访问时间为,其中是内存的大小。当然,。实际上,访问数组元素的速度要快得多。原因是是有界的,但是...也是如此!Ô (1 )ø (日志Ñ )ø (日志米)米米≥ Ñ 米Ñ
编辑:谢谢您的链接(有关懒惰的论文的链接不可用,这里是另一个)。正如评论和我的回答中上面所述,通过提供时间查询,RAM模型对于纯FP有点不公平,即使一个地址的大小不受限制。我还不了解这个惰性技巧是如何工作的,但我认为必须注意,这仅适用于此特定问题。
这取决于您的表达能力。
这是一个论点,即高阶确实会增加一些东西:对于一阶语言,原始递归不足以表达Ackermann函数。但是,在存在高阶函数的情况下,原始递归就足够了:
这仅使用原始递归来定义Ackermann函数。
Iter