如何在Haskell中检测列表的结尾?

时间:2015-02-21 05:43:32

标签: list haskell non-exhaustive-patterns

我正在写一个递归函数,它使用特定的公式来计算2个列表。 但是我会简化这个功能,这样你就可以理解我遇到的问题,因为这里要点是检测列表的[]。

所以我有以下代码:

listSum::([Integer],[Integer])->Double
listSum ((x:xs),(y:ys)) 
    | ((x:xs),(y:ys))==(x:[],y:[])=0.0
    | otherwise = (((fromIntegral x)::Double)+((fromIntegral y)::Double)) + listSum ((xs),(ys))

我现在正在输出

listSum([1,2],[1,2])
2.0

listSum([1],[1])
0.0

listSum([],[])
*** Exception: file.hs: .....: Non-exhaustive patterns in function ListSum

我想要的输出

listSum([1,2],[1,2])
6.0

listSum([1],[1])
2.0

listSum([],[])
0.0

我错过了什么?或者我写得太多了?

1 个答案:

答案 0 :(得分:3)

你不需要你职能中的第一个守卫。您可以简单地将其写为以下内容(我只是删除了::Double,因为Haskell可以推断它)

listSum :: ([Integer], [Integer]) -> Double
listSum ([], []) = 0.0
listSum ((x:xs),(y:ys)) = fromIntegral x + fromIntegral y + listSum (xs, ys)

现在,只要传递给listSum的参数是空列表,结果就是0.0,否则将调用递归函数。

注意:只有两个列表大小相同时,上述功能才有效。否则,您需要像这样写

listSum::([Integer],[Integer])->Double
listSum ([], []) = 0.0
listSum ((x:xs), []) = fromIntegral x + listSum(xs, [])
listSum ([], (y:ys)) = fromIntegral y + listSum(ys, [])
listSum ((x:xs),(y:ys)) = fromIntegral x + fromIntegral y + listSum (xs, ys)

注意:更简单,整个代码可以写成as suggested by Rein Henrichs,就像这样

pairwiseSum xs ys = sum (zipWith (+) xs ys)