Home Articles

Haskell - 函数中的非详尽模式

Asked
Viewed 614 times
0

以下函数的要点是获取列表并将列表拆分为2个列表的元组 . 第一个列表将保持偶数索引项,第二个列表将保持奇数索引项 . “Pos”是目前的位置 . (函数调用时传入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 Answer

  • 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)
    

Related