Haskell 相当新。任何解释我做错了什么的帮助将不胜感激

Fairly new in Haskell. Any help explaining what I'm doing wrong would be greatly appreciated

这是我的 sumEvenOdd 函数,它接受一个数字列表。它 return 是两个数字的元组:给定列表中偶数索引项的总和,以及奇数索引项的总和。指数从零开始。

sumEvenOdd :: Num a => [a] -> (a, a)
sumEvenOdd (x:xs) = ((foldl1 (+) (evens(xs))), (foldl1 (+) (odds(xs)))) where
evens (x:xs) = x:odds xs
odds (_:xs) = evens xs

为了得到我的赔率,我只是跳过了一个地点

如果我调用 sumEvenOdd [1,2,3,4] 应该 return (4,6) 要么, sumEvenOdd [] 应该 return (0,0).

但我得到“Exception:Non-函数赔率的详尽模式”

我只是没看到冗余模式在哪里。

没有冗余模式,有模式有non-exhaustive:这些不考虑空表。你因此实现 evensodds 与:

sumEvenOdd :: Num a => [a] -> (a, a)
sumEvenOdd xs = (sum (evens xs), sum (odds xs))

evens :: [a] -> [a]
evens [] = []
evens (x:xs) = x : odds xs

odds :: [a] -> [a]
odds [] = []
odds (_:xs) = evens xs

您可以使用 sum :: (Foldable f, Num a) => f a -> a。使用 foldl1 (+) 不适用于 列表。