2014-12-01 2 views
1

Я пытаюсь написать функцию, которая принимает список списков Ints в качестве входных данных и возвращает список Int, содержащий сумму второго и третьего элементов каждого списка, если список содержит не менее 3 элементов.Сумма вторых и третьих элементов списка списков интов в Хаскелле?

У меня есть ошибка о неисчерпаемом шаблоне с тем, что у меня есть, и я не знаю почему.

sumSecondThird :: [[Int]] -> [Int] 
sumSecondThird [] = [] 
sumSecondThird ((_:x:y:_):xs) = (x+y):(sumSecondThird xs) 

я могу заставить его работать, используя функцию !!, но я хочу использовать поиск по шаблону. Любая помощь в том, почему это не работает?

ответ

1

Это хорошая идея, чтобы собрать с -Wall, как это часто может выявить потенциальные источники ошибок:

Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for ‘sumSecondThird’: 
     Patterns not matched: 
      [] : _ 
      [_] : _ 
      [_, _] : _ 

Ваш матч модель все еще не хватает нескольких возможностей, поэтому всякий раз, когда sumSecondThird сталкивается с ними она не будет выполнена с RUN- временная ошибка.

Чтобы исправить решение, вам необходимо обработать корпус для этих отсутствующих шаблонов. Поскольку эти модели возникают только, если список короче 3 элемента, вы можете просто игнорировать их и двигаться дальше:

sumSecondThird :: [[Int]] -> [Int] 
sumSecondThird [] = [] 
sumSecondThird ((_:x:y:_):xs) = (x+y):(sumSecondThird xs) 
sumSecondThird (_:xs) = sumSecondThird xs 
+0

ли это считать примитивной рекурсии? Потому что я забыл упомянуть это требование. – user130554

+0

Я не совсем уверен, что в этом контексте означает примитивная рекурсия, но это должно быть потому, что в ее реализации не так много свободы. – Rufflewind

0
sumSecondThird :: [[Int]] -> [Int] 
sumSecondThird = foldr go [] where 
    go (_:x:y:_) r = x + y : r 
    go _   r = r 
Смежные вопросы