【发布时间】:2014-10-06 20:31:59
【问题描述】:
以下函数的重点是接收一个列表并将列表拆分为 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 变为 [] 在这种情况下它会停止。
我错过了什么吗?
【问题讨论】:
-
如果列表不为空,但您的元组包含一个空列表会怎样?
-
您可以使用
even pos代替pos `mod` 2 == 0。 (我知道这不能解决您的问题,但 Zeta 可以) -
没关系,函数不会在元组上递归。 [] ++ [x] 不是有效语句吗?事实上,这应该几乎总是如此,因为传入的元组实际上是空的。有没有办法让我指定我希望它在两种情况下都进行递归?