【发布时间】:2016-12-02 07:50:00
【问题描述】:
在this answer on CodeReview 中,提问者和回答者似乎都对 (++) 运算符不屑一顾。这是因为它的速度(导致算法在 O(n^2) 中显式运行,其中 n 是列表 iirc 的长度)?如果没有经过其他测试,这是否是预优化,因为 Haskell 以难以推理时间复杂度而闻名?其他人是否应该在他们的程序中避免使用 (++) 运算符?
【问题讨论】:
-
Haskell 列表是链表,附加列表是严格语言中的 O(n) 操作。然而,在 Haskell 中,它并不那么简单:懒惰允许将工作推迟到使用列表之前,从而有效地将成本分配到列表的长度上。正如您所提到的,这种懒惰会使时间和空间的复杂性难以在 Haskell 中进行推理,但我认为其他语言的相同建议也适用于 Haskell:首先为了清晰而编写,当且仅当你们都需要时才优化速度它会跑得更快并且你已经分析到找到一个瓶颈。
-
两者兼而有之——你的代码更难推理,它通常会减慢你的代码速度,你可以经常使用它——但这完全取决于情况和 IMO 你的问题是不具体,不适合 SO
-
@Carsten:我对你关于“它通常会减慢你的代码”的评论感到有点困惑。虽然对于典型的尾递归阶乘示例来说确实如此,但这在日常程序中真的很常见吗?我认为 Haskell 之类的东西比 Ruby 和 Python 等更流行的外部语言之一的好处是富类型系统提供的优化。如果您真的认为我的问题不够具体,那么在我提供的示例中呢,只保留最后一个问题(这是我的意图,我认为 ThreeFx 想通了。
-
如果我认为这个问题不适合 SO,你不必担心 - 这不是关于问题,而是关于 SO
-
我不担心,我只是认为它适合 SO。 ThreeFx 能够在这方面为我提供很大帮助,我希望其他许多人也一样。