Как можно суммировать средние элементы расширяющегося списка в Haskell? - PullRequest
0 голосов
/ 20 ноября 2018

Пока я знаю, как расширить список с его концов, но в итоге они удваиваются из-за первого условия, которое заключается в удвоении синглтона.Будет ли смысл для кода выглядеть так:

sumExpand :: [Integer] -> [Integer]

sumExpand l = expand l []
  where
    expand [] a     = a
    expand (x:[]) a = x: expand [] (x:a)
    expand (x:xs) a = expand (x:a) (expand xs a)

А для меня нужно поработать над его выводом:

[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]

Последнее - мое желание?Вот как я получил временное решение для списка из двух элементов:

expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))

Вывод:

*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]

РЕДАКТИРОВАТЬ: в основном, я хочу, чтобы алгоритмработать так: [a, b, c] => [a, a+b, b+c, c]

1 Ответ

0 голосов
/ 20 ноября 2018

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

a   b   c   d   e
    a   b   c   d   e
---------------------------
a  a+b b+c c+d d+e  e

Заполните каждый пустой слот 0 (0:x и x++[0])и вам просто нужно zipWith

> \x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
...