2016-03-21 92 views

回答

4

一个简单的办法是写一个简单的递归函数来处理两个列表合为一体。此功能需要3可能的情况

  1. 第一个列表是空的,所以我们只返回第二个直道,因为没有进一步的混合工作要做。

    mixLists [] ys = ys 
    
  2. 第二个列表也可能是空的,正如我们所预料的,在这种情况下,我们只返回第一个列表,不管它可能是

    mixLists xs [] = xs 
    
  3. 现在,如果我们做了它过去这两个条款,我们知道,无论是xs也不ys是空的,所以我们只需要解释,如果两者都做什么非空

    mixLists (x : xs) (y : ys) = ? 
    

    现在我们要创建一个以x后跟y开头的新列表,因为我们将两个列表混合在一起,其中一个以x开头,另一个以y开头。

    mixLists (x : xs) (y : ys) = x : y : ? 
    

    现在我们必须弄清楚这个输出列表的其余部分应该是什么。我们的规格大概是说,它应该包含xsys不一,我们可以很容易地计算出使用递归调用

    mixLists (x : xs) (y : ys) = x : y : mixLists xs ys 
    
2

如果你能限制住这些清单必须是相同的长度,你可以用一个班轮解决这个....

mixLists = concat . zipWith ((. return) . (:)) 

这可能是一个有趣的练习要弄清楚它是如何工作.... Hint-在zipWith功能也可以写为\x y -> [x, y]

+1

我认为这样会很好,但它不起作用:这会在元素因为'zipWith'而停止平等之后掉落元素。 – jozefg

+1

@jozefg糟糕,你是对的......我错过了这一点。我几乎删除了我的答案,但相反,我只是指出了答案的局限性,因为我相信其他人会有同样的想法...... – jamshidh

+1

如果你是一个可怕的一个衬垫的粉丝,那么'修复$ \ k xs ys - >也许ys id $ flip(:)(k ys(drop 1 xs))\'fmap \'listToMaybe xs' – user2407038

相关问题