2014-05-23 3 views
0

Я пытался использовать inits функцию, чтобы создать функцию, которая делает:накопленная сумма в Haskell

[x1,x2,x3,x4,x5....] == [0,x1, x1+x2, x1+x2+x3, x1+x2+x3+x4, (x1+x2+x3+x4+x5) ....] 

это моя попытка:

sums:: [Int]->[Int] 
sums (x:xs) = [x] ++ map foldr 0 (+) initial xs 


inits1:: [int] -> [[int]] 
inits1 []  = [[]] 
inits1 (x:xs) = [[x]] ++ map (x:) (initial xs) 
+0

Вы должны добавить круглые скобки вокруг рисунка 'х: xs' (т.е.' суммы (х: Xs) = ... '). –

+0

теперь я получаю больше ошибок .. :( – Ohad

+3

' scanl' уже делает то, что вы муравей. – Lee

ответ

3

Использование inits - это плохой способ сделать это.

Подумайте об этом. Если бы вы делали это на бумаге, вы бы не добавляли первый номер, затем первые два, затем первые три, затем первые четыре.

Это глупо, потому что, когда вы добавляете первые четыре, вам нужно повторно добавить первые три, даже если вы уже добавили их раньше.

Вместо этого вы только что начали добавлять их, сохранив итоговое значение, и эти итоговые результаты сформировали бы ваши результаты.

Таким образом, вы должны использовать scanl1, которая, как foldl1, но дает вам результаты, как он идет:

sums = scanl (+) 0 

избежать библиотечных функций показывает лучше, как это должно быть сделано (и примерно как scanl работает:

sums2 ls = sums_worker 0 ls where 
    sums_worker acc (l:ls) = acc:(sums_worker (acc + l) ls) 
    sums_worker acc [] = [acc] 
+1

Педантичный режим: автор хотел, чтобы суммы начинались с 0. :-) –

+0

Уопс исправлено. – Clinton

+0

приятно. Вы не использовали библиотечную функцию? sums_worker - это функция, которая получает что? что такое «acc (l: ls)»? Вы могли бы добавить замедление, пожалуйста? – Ohad

4

Вы можете использовать стандартную библиотеку?

sums :: Num a => [a] -> [a] 
sums = scanl (+) 0 
1

inits даст все начальные сегменты списка, и sum даст сумму списка числа, так что ваш sums может быть определена следующим образом:

sums = map sum . inits 

Пример

> sums [1..10] 
[0,1,3,6,10,15,21,28,36,45,55] 
+0

Однако он не добавляет нуля в начале. – Ohad

Смежные вопросы