簡體   English   中英

如何在Haskell中檢測列表的結尾?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM