我將如何去寫一個函數來兩個列表這樣搭配:創建一個函數,從兩個列表組合要素
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