Haskell 优化无限列表实现
Haskell optimizing infinite list implementation
我的代码给出了想要的结果,但我想知道是否有更好的编码方法。这是给定的例子:
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
使用 cons 运算符 :
将比连接列表更高效:
pair :: [a] -> [[a]]
pair (x:y:xs) = [x, y] : pair xs
原因是 Haskell 中的列表是链接列表,其中每个项目都指向下一个项目,直到列表末尾。 Pushes 和 Pops 在列表的头部完成时很便宜,因为你只是将头部指向现有列表的头部。
连接两个链表时,实际上是在重建完整的第一个链表,以便其最后一个元素可以指向第二个链表的第一个元素。
在您的示例中,性能提升很小,因为您的列表中只有两个元素,但作为一般规则,如果您处理列表头部的操作,它几乎总是会更多使用缺点的性能。
我的代码给出了想要的结果,但我想知道是否有更好的编码方法。这是给定的例子:
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
使用 cons 运算符 :
将比连接列表更高效:
pair :: [a] -> [[a]]
pair (x:y:xs) = [x, y] : pair xs
原因是 Haskell 中的列表是链接列表,其中每个项目都指向下一个项目,直到列表末尾。 Pushes 和 Pops 在列表的头部完成时很便宜,因为你只是将头部指向现有列表的头部。
连接两个链表时,实际上是在重建完整的第一个链表,以便其最后一个元素可以指向第二个链表的第一个元素。
在您的示例中,性能提升很小,因为您的列表中只有两个元素,但作为一般规则,如果您处理列表头部的操作,它几乎总是会更多使用缺点的性能。