Haskell教程说,当我们使用" Hello" ++"时要小心谨慎。世界",新的列表构造必须访问所有单个元素(这里," Hello"的每个字符),所以如果列表在" ++"的左边。很长,然后使用" ++"会降低表现。
我认为我没有正确理解,Haskell的开发人员是否从不调整列表操作的性能?为什么这个操作仍然很慢,在任何lambda函数或currying中都有某种语法一致性?
任何提示?感谢。
答案 0 :(得分:7)
在某些语言中,“列表”是一种通用序列类型,旨在为连接,拆分等提供良好的性能。在Haskell和大多数传统的函数式语言中,列表是一种非常特定的数据结构,即单链表。如果你想要一个通用序列类型,你应该使用Data.Sequence
包中的containers
(它已经安装在你的系统上,为各种操作提供了非常好的大O渐近线),或者可能是其他一些针对常见使用模式进行了大量优化的。
答案 1 :(得分:4)
如果你有一个带有头部和尾部引用的不可变列表,你就不能改变它的尾部。如果要在列表的“结尾”添加内容,则必须到达结尾,然后将所有项目逐个放入右侧列表的开头。它是不可变列表的基本属性:连接是昂贵的。
答案 2 :(得分:4)
Haskell列表就像单链表:它们要么是空的,要么是头部和(可能是空的)尾部。因此,当将某些内容附加到列表中时,您首先必须遍历整个列表才能结束。因此,您最终遍历整个列表(您追加的列表,即),这需要O(n)运行时。