Использование 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]
Вы должны добавить круглые скобки вокруг рисунка 'х: xs' (т.е.' суммы (х: Xs) = ... '). –
теперь я получаю больше ошибок .. :( – Ohad
' scanl' уже делает то, что вы муравей. – Lee