Haskell优化无限列表实现

时间:2017-03-24 15:40:02

标签: list haskell optimization infinite

我的代码给出了想要的结果,但我想知道是否有更好的方法来编写代码。这是给出的例子:

pair [ 1 , 2 , 3 , 4 , 5 , 6 , ... ]
[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] , ... ]

和给定的代码:

pair::[a] -> [[a]]
pair =

我的解决方案:

pair :: [a] -> [[a]]
pair (x:y:xs) = ((x:y:[]):[]) ++ pair xs

1 个答案:

答案 0 :(得分:1)

使用cons运算符:将比连接列表更高效:

pair :: [a] -> [[a]]
pair (x:y:xs) = [x, y] : pair xs

原因是Haskell中的列表是链表,其中每个项指向下一个直到列表结尾。当在列表的头部完成时,推送和弹出是便宜的,因为你只是将头部指向现有列表的头部。

当您连接两个链表时,您实际上是在重建完整的第一个列表,以便它的最后一个元素可以指向第二个列表的第一个元素。

在你的例子中,性能提升很小,因为你的列表中只有两个元素,但作为一般规则,如果你正在处理列表头部的操作,那么它几乎总是更有效率。使用缺点。