我正在阅读Haskell School of Expression的第69页,我不确定我是否正确评估rev [1:2:3:4]
。
Hudak没有在他的reverse
书中详细解释评估(重写)顺序。
有人可以确认我的猜测(如附图所示)是正确的,或者如果不正确,请指出我的错误。我认为这是正确的,但我不是百分百肯定,这是要求的原因。
所以问题是:
当我评估reverse
的一步然后进行评估(即重写)时,结果应该用括号括起来,对吗?
如果我理解正确,这些不完整的括号表示是reverse
的差(读二次)时间复杂度的原因。在这个例子中,为了反转4个元素列表,总共花费了6个步骤来追加列表。
答案 0 :(得分:3)
是的,嵌套的左关联调用追加(在Haskell中,名称为(++)
和(<>)
)会导致单链表的性能不佳。
这个问题有几种解决方案,因为它至少已知30年或40年。我相信reverse
的库版本使用累加器来实现线性复杂度而不是二次方,但它仍然不是你想在列表上经常调用的东西。