【问题标题】:Reversing a list, evaluation order颠倒列表,评估顺序
【发布时间】:2014-07-21 18:44:14
【问题描述】:

我正在阅读 Haskell School of Expression 的第 69 页,我不确定我是否得到了rev [1:2:3:4] 的评估是否正确。

Hudak 在他的书中没有详细解释reverse 的评估(重写)顺序。

请有人确认我的猜测(如附图所示)是正确的,或者如果不正确,请指出我错了什么。我相信它是正确的,但我不是 100% 肯定,这就是问的原因。

所以问题是:

当我评估reverse 的一个步骤然后在评估之后(即重写)结果应该用括号括起来,对吗?

如果我理解正确,括号的这些不幸出现是reverse 时间复杂度差(读取二次)的原因。在此示例中,总共花费了 6 个步骤来添加列表以反转 4 元素列表。

【问题讨论】:

  • 它看起来只是一个“错字”,但是您对rev 的定义是错误的,您应该在(x:xs) 案例的右侧使用++ 而不是:
  • 看起来您的评估顺序是正确的,但是对于为什么这很慢的一些解释,请查看this 问题。
  • 谢谢 bheklir,确实是一个错字。

标签: haskell


【解决方案1】:

是的,嵌套的左关联调用 append(在 Haskell 中,名称为 (++)(<>))会导致单链表性能不佳。

这个问题有多种解决方案,因为它至少已经为人所知 30 或 40 年了。我相信 reverse 的库版本使用累加器来实现线性复杂度而不是二次复杂度,但它仍然不是你想在列表中经常调用的东西。

【讨论】:

  • @DanielWagner Doh!你是对的,我一定是读错了输出,因为我输入了它来检查。但foldl' (flip (:)) [] 的实现实际上确实颠倒了列表。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多