我的代码给出了想要的结果,但我想知道是否有更好的方法来编写代码。这是给出的例子:
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
答案 0 :(得分:1)
使用cons运算符:
将比连接列表更高效:
pair :: [a] -> [[a]]
pair (x:y:xs) = [x, y] : pair xs
原因是Haskell中的列表是链表,其中每个项指向下一个直到列表结尾。当在列表的头部完成时,推送和弹出是便宜的,因为你只是将头部指向现有列表的头部。
当您连接两个链表时,您实际上是在重建完整的第一个列表,以便它的最后一个元素可以指向第二个列表的第一个元素。
在你的例子中,性能提升很小,因为你的列表中只有两个元素,但作为一般规则,如果你正在处理列表头部的操作,那么它几乎总是更有效率。使用缺点。