[英]How to detect the end of a list in Haskell?
我正在寫一個遞歸函數,使用特定的公式來計算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
我錯過了什么? 還是我寫得太多了?
你的功能中不需要第一個后衛。 你可以簡單地把它寫成如下(我剛剛刪除::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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.