Haskell优化无限列表实现

问题描述 投票:0回答:1

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

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
list haskell optimization infinite
1个回答
1
投票

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

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

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

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

在您的示例中,性能增益很小,因为您的列表中只有两个元素,但作为一般规则,如果您正在处理列表头部的操作,那么使用cons几乎总是更高效。

© www.soinside.com 2019 - 2024. All rights reserved.