我如何编写一个函数来混合两个列表:
mixLists :: [a] -> [a] -> [a]
mixLists [1,2,3] [4,6,8,2] = [1,4,2,6,3,8,2]
答案 0 :(得分:4)
一个简单的选择是编写一个简单的递归函数来将两个列表处理成一个。此功能需要3种可能的情况
第一个列表是空的,所以我们只是直接返回,因为没有进一步的混合。
mixLists [] ys = ys
第二个列表也可能是空的,正如我们所料,在这种情况下,我们只返回第一个列表,无论它是什么
mixLists xs [] = xs
现在,如果我们已经超过这两个条款,我们知道xs
和ys
都不是空的,所以我们只需要解释如果两者都是非空
mixLists (x : xs) (y : ys) = ?
现在我们要创建一个以x
开头,后跟y
的新列表,因为我们将两个列表混合在一起,其中一个列表以x
开头,另一个列表,y
。
mixLists (x : xs) (y : ys) = x : y : ?
现在我们必须弄清楚这个输出列表的其余部分应该是什么。我们的规范可能会说它应该包含xs
和ys
混合,我们可以使用递归调用轻松计算
mixLists (x : xs) (y : ys) = x : y : mixLists xs ys
答案 1 :(得分:2)
如果您可以忍受列表需要相同长度的限制,您可以使用一个班轮来解决这个问题....
mixLists = concat . zipWith ((. return) . (:))
要弄清楚它是如何工作的,这可能是一个有趣的练习....提示 - zipWith中的函数也可以写成\x y -> [x, y]
。