我将如何去写一个函数来两个列表这样搭配:创建一个函数,从两个列表组合要素
mixLists :: [a] -> [a] -> [a]
mixLists [1,2,3] [4,6,8,2] = [1,4,2,6,3,8,2]
我将如何去写一个函数来两个列表这样搭配:创建一个函数,从两个列表组合要素
mixLists :: [a] -> [a] -> [a]
mixLists [1,2,3] [4,6,8,2] = [1,4,2,6,3,8,2]
一个简单的办法是写一个简单的递归函数来处理两个列表合为一体。此功能需要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
如果你能限制住这些清单必须是相同的长度,你可以用一个班轮解决这个....
mixLists = concat . zipWith ((. return) . (:))
这可能是一个有趣的练习要弄清楚它是如何工作.... Hint-在zipWith功能也可以写为\x y -> [x, y]
。
我认为这样会很好,但它不起作用:这会在元素因为'zipWith'而停止平等之后掉落元素。 – jozefg
@jozefg糟糕,你是对的......我错过了这一点。我几乎删除了我的答案,但相反,我只是指出了答案的局限性,因为我相信其他人会有同样的想法...... – jamshidh
如果你是一个可怕的一个衬垫的粉丝,那么'修复$ \ k xs ys - >也许ys id $ flip(:)(k ys(drop 1 xs))\'fmap \'listToMaybe xs' – user2407038