Haskell - 函数中的非详尽模式

时间:2014-10-06 20:31:59

标签: list haskell tuples

以下功能的要点是获取列表并将列表拆分为2个列表的元组。第一个列表将保持偶数索引项,第二个列表将保持奇数索引项。 "平面"是目前的职位。 (函数调用时传入0)。传入的列表的初始元组是([],[])

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变为[],在这种情况下它会停止。

我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

当第一个列表非空时但是元组参数中的一个(或两个)列表为空时,没有匹配,例如。

split [1] ([], [])

但是你的第二个子句似乎并不要求元组中的任何一个列表都是非空的,所以你可以将它改为:

split (x:xs) (ys,zs) pos
    | pos `mod` 2 == 0  = doSplit xs (ys ++ [x], zs) (pos + 1)
    | otherwise         = doSplit xs (ys, zs ++ [x]) (pos + 1)