2016-03-21 91 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

相關問題