2016-05-09 5 views
1

Я должен подытожить элементы списка наподобие этого: , если ваш вход ['a','b','c'], выход должен быть ["a","ab","abc"]. Но я понятия не имею, как закодировать это ... может ли кто-нибудь дать мне подсказку? Буду очень признателен вам!Haskell: суммирование элементов списка

+0

Подсказка? Хорошо: если это [непустые списки] (http://hackage.haskell.org/package/semigroups-0.18.1/docs/Data-List-NonEmpty.html#t:NonEmpty), вы можете просто использовать кнопку [ duplicate] (http://hackage.haskell.org/package/comonad-5/docs/Control-Comonad.html#v:duplicate) метод comonad. (Нет никакого реального последовательного способа определить, какой результат должен быть для пустого списка!) Серьезно, хотя, я сомневаюсь, что это поможет вам сейчас, и я не думаю, что любой другой ответ, который мы могли бы дать, поможет вам в первую очередь чтение некоторых учебных пособий. Я всегда рекомендую [LYAH] (http://learnyouahaskell.com/). – leftaroundabout

+0

Знаете ли вы о совпадении шаблонов? – PyRulez

+6

Немного легче намекнуть на то, чтобы указать вам на ['scanl'] (http://hackage.haskell.org/package/base-4.8.2.0/docs/Prelude.html#v:scanl);) –

ответ

1

все эти намеки хорошо, но вы, вероятно, бороться с теми, слишком

Я хотел бы предложить вам начать отсюда:

sumList [] = [] 
sumList [x] = [[x]] 
sumList (x:xs) = ... : map (...) (sumList xs) 

и попытаться выяснить, что вы должны поставить в оба ... (hint не то же самое;))

первая строка только для того, чтобы дать правильный результат для пустого списка в качестве ввода - вы можете удалить его (рекурсия не должна ударяться)

Второй будет делать [1] -> [[1]]

Теперь вы должны выяснить, что делать с более - вот дополнительный намек:

sumList [1,2] 
{ 3. line - x = 1, xs = [2] } 
= ... : map (...) (sumList [2]) 
{ 2. line } 
= ... : map (...) [[2]] 

теперь вы хотите

= [[1],[1,2]] 

, так что вы можете сделать это с помощью

first ... = [1] 
second ... = map (prepend 1) to every list in [[2]] 
Смежные вопросы