其他人已经指出了解析错误。让我在这段代码中的逻辑错误上添加一些东西,即使没有明确要求。
-- Syntactically fixed code
doubleEveryOtherHelper :: [Integer] -> Int -> [Integer]
doubleEveryOtherHelper (x:x1:xs) len
| len > 2 = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
| len == 2 = x : 2*x1 : []
| len == 1 = [2*x]
| otherwise = []
我猜len 参数应该是整数列表的长度。
现在,x:x1:xs 模式匹配第一个元素为 x,第二个元素为 x1 的列表。因此,该模式将 从不 与少于两个元素的列表匹配。这意味着对len==1 或<1 的测试将始终失败。
这样做的惯用方法是指定要匹配的多个模式。你的匹配至少有 2 个元素长的列表,所以让我们用两种模式覆盖 0-long 和 1-long 列表。
doubleEveryOtherHelper :: [Integer] -> Int -> [Integer]
doubleEveryOtherHelper [] len = ???
doubleEveryOtherHelper [x] len = ???
doubleEveryOtherHelper (x:x1:xs) len
| len > 2 = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
| len == 2 = x : 2*x1 : []
| len == 1 = [2*x]
| otherwise = []
那么,让我们用底部的代码填充那些???:
doubleEveryOtherHelper :: [Integer] -> Int -> [Integer]
doubleEveryOtherHelper [] len = [] -- was in the oterwise case
doubleEveryOtherHelper [x] len = [2*x] -- was in the len==1 case
doubleEveryOtherHelper (x:x1:xs) len
| len > 2 = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
| len == 2 = x : 2*x1 : []
现在,关注最后一行。当len 为二时,我们必须有xs==[]。在这种假设下,我们有doubleEveryOtherHelper xs anyLength == [],因此我们可以通过将最后一行中的[] 替换为等效的doubleEveryOtherHelper xs (len - 1) 来使他的代码更复杂。为什么我们要让代码更复杂?!?嗯,这样的结果是
doubleEveryOtherHelper :: [Integer] -> Int -> [Integer]
doubleEveryOtherHelper [] len = [] -- was in the oterwise case
doubleEveryOtherHelper [x] len = [2*x] -- was in the len==1 case
doubleEveryOtherHelper (x:x1:xs) len
| len > 2 = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
| len == 2 = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
很明显,最后两种情况可以使用相同的代码来处理:
doubleEveryOtherHelper :: [Integer] -> Int -> [Integer]
doubleEveryOtherHelper [] len = []
doubleEveryOtherHelper [x] len = [2*x]
doubleEveryOtherHelper (x:x1:xs) len = x : 2*x1 : doubleEveryOtherHelper xs (len - 1)
现在,我们根本不使用len 参数。因此,如果我们同意在调用站点上删除它,我们可以将其删除。
doubleEveryOtherHelper :: [Integer] -> [Integer]
doubleEveryOtherHelper [] = []
doubleEveryOtherHelper [x] = [2*x]
doubleEveryOtherHelper (x:x1:xs) = x : 2*x1 : doubleEveryOtherHelper xs
简单多了,不是吗?
请注意,doubleEveryOtherHelper [1,2,3] = [1,4,6] 而不是[1,4,3] 中仍然存在一个错误,我认为这应该是预期的答案。我认为您现在应该可以自己修复它了。