以下函數的要點是獲取列表並將列表拆分爲2個列表的元組。第一個列表將維護偶數索引項目,第二個列表將維護奇數索引項目。 「Pos」是目前的位置。 (在函數調用中傳入0)。列表中通過了最初的元組([],[])Haskell - 函數中的非窮舉模式
split :: [Integer] -> ([Integer],[Integer]) -> Integer -> ([Integer], [Integer])
split [] (x,y) _ = (x,y)
split (x:xs) ((y:ys),(z:zs)) pos
| pos `mod` 2 == 0 = doSplit xs ((y:ys) ++ [x], (z:zs)) (pos + 1)
| otherwise = doSplit xs ((y:ys), (z:zs) ++ [x]) (pos + 1)
Haskell是報告
*** Exception: split.hs:(113,1)-(116,73): Non-exhaustive patterns in function split
我明白,它認爲我還沒有涵蓋「某些情況下」應覆蓋但是我覺得我已經涵蓋了所有的情況。
如果列表爲空 - >返回在 中傳遞的列表的元組否則 - >將x粘貼到其中一個列表上並在xs上遞歸。
從我的角度來看,這個函數是嚴格遞減的,直到xs變成[],在這種情況下它會停止。
我錯過了什麼嗎?
如果列表不爲空,會發生什麼,但你的元組包含一個空列表? – Zeta 2014-10-06 20:33:55
你可以使用'even pos'而不是'pos \'mod \'2 == 0'。 (我意識到這並不能解決你的問題,但Zeta確實如此) – 2014-10-06 20:37:15
它應該沒關係,函數不會在元組上遞歸。 是[] ++ [x]不是一個有效的語句嗎?事實上,這應該幾乎總是如此,因爲傳入的元組實際上是空的。有沒有辦法讓我指定我希望它在兩種情況下都能進行遞歸? – Aserian 2014-10-06 20:38:20