我正在写一个递归函数,它使用特定的公式来计算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
我错过了什么?或者我写得太多了?
答案 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)