1

我正在编写一个使用特定公式来计算 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

我错过了什么?还是我写的太多了?

4

1 回答 1

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)

注意:更简单的是,可以按照Rein Henrichs 的建议编写整个代码,如下所示

pairwiseSum xs ys = sum (zipWith (+) xs ys)
于 2015-02-21T05:46:21.150 回答