【发布时间】:2012-01-09 18:55:46
【问题描述】:
Learn You a Haskell 提到 difference lists(在该页面上搜索该术语),其中列表 l 不是直接表示,而是作为函数 (l++) 表示。这允许更有效的左右连接。串联成为函数组合,最终可以通过($[])转换成真实的列表。我想知道可以在差异列表上有效地支持哪些操作。例如,对于差异列表,(:) 的等价物是
\x l -> (x:) . l
可以有效地为差异列表实现head 和tail 吗?这是明显的实现:
headTailDifList :: ([a] -> [a]) -> (a, [a] -> [a])
headTailDifList dl = (head l, ((tail l)++))
where
l = dl []
对于真实列表,\l -> (head l, tail l) 以恒定时间运行。这个headTailDifList 怎么样?可能是因为惰性求值,只有l 的第一个元素会被求值?
- 考虑到差异列表是一个函数而不是实际的“值”,问这是否在恒定时间内运行意味着什么?
-
headTailDifList是否以恒定时间运行? -
还有其他一些固定时间的实现吗?这是一个候选人:
headTailDifList dl = (head (dl []), tail.dl )但是,如果
dl是id(空差异列表),则尾部不会引发异常。
【问题讨论】:
-
可以在 dlist 上实现 head 和 tail,但不应该。 Dlists 仅适用于构建常规 cons 列表后的高效构建和简单的“变质”。如果您需要像 head 或 tail 这样的操作,您需要不同的数据结构,例如Data.Sequence 或连接(二进制)列表。
标签: list haskell lazy-evaluation