Я изучаю синтаксис шаблона в Haskell, и теперь у меня проблема с моей небольшой функцией.
Я хочу добавить два элемента списка, как в примере:
input 1: [1,2,3,4,5], output2: [3,5,7,9]
input 2: [1,2,3,4,5,6], ouput 2: [3,5,7,11]
Мой код (я пытался сделать шаблон для двух элементов, но он говорит, что шаблоны перекрываются):
g4 [] = []
g4 [x] = []
-- g4 (x:y:xs) = x+y: g4 xs
g4 (x:y:z:xs) = x+y:y+z: g4 (xs)
Это должно выглядеть так, но я не знаю, как создать шаблон для двух элементов:
g1 [1,2,3,4,5]
= 1+2 : 2+3 : g1 [3,4,5]
= 3+4 : 4+5 : g1 [5]
= []
g1 [1,2,3,4,5,6]
= 1+2 : 2+3 : g1 [3,4,5,6]
= 3+4 : 4+5 : g1 [5,6]
= 5+6
Контрольная работа:
*Main> g4 [1,2,3]
[3,5] -- worked
*Main> g4 [1,2,3,4]
[3,5,4] -- did not work
*Main> g4 [1,2,3,4,5]
*** Exception: Test.hs:(127,1)-(130,32): Non-exhaustive patterns in function g4 -- didnt work
[3,5*Main> g4 [1,2,3,4,5,6]
[3,5,9,11] -- worked
1
FastBatteryCharger
3 Май 2016 в 23:25
2 ответа
Лучший ответ
Вы можете вызвать g4
для комбинации (y:xs)
для вашего рекурсивного компонента:
g4 [] = []
g4 [x] = []
g4 (x:y:xs) = x+y : g4 (y:xs)
3
alykhank
3 Май 2016 в 20:36
Вы можете просто заархивировать список со «сдвинутой» версией самого себя.
g4 xs = zipWith (+) xs (tail xs)
2
Daniel Wagner
3 Май 2016 в 21:06
Похожие вопросы
Новые вопросы
list
Тег списка может относиться к связанному списку (упорядоченный набор узлов, каждый из которых ссылается на своего преемника) или к форме динамического массива. Не использовать для списков HTML, используйте вместо этого [html-lists].