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:这些不考虑空表。你因此实现 evens
和 odds
与:
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 (+)
不适用于 空 列表。
这是我的 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:这些不考虑空表。你因此实现 evens
和 odds
与:
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 (+)
不适用于 空 列表。