На предоставленном вами изображении написано *
вместо ^
.Было бы хорошо увидеть некоторые из ваших попыток.Один из простых подходов состоит в том, чтобы отобразить функцию splitAt
по каждому возможному индексу, затем использовать функцию sum
в каждой паре, чтобы получить пару (начальная сумма сегмента, конечная сумма сегмента), а затем для каждой пары умножить ее элементы вместе,затем сложите все полученные продукты.Как далеко вы можете продвинуться с этим кодированием?
РЕДАКТИРОВАТЬ: чтобы уберечь потенциальных будущих читателей от прокрутки всех комментариев, ниже приведена потенциальная реализация, в которой используется только sum
.Это неоптимально, потому что это sum
с одними и теми же подсписками много раз, лучшая реализация может начаться с использования scanl
в обоих направлениях для генерации частичных сумм и продолжения оттуда.
xsum (x:xs@(y:ys)) = x * sum xs + xsum ((x+y):ys)
xsum _ = 0
EDIT2:У нас есть (вроде) движение вперед и назад, мне нравится!
xsum = fst . xsum'
where xsum' (x:xs@(y:ys)) = (\(acc,s) -> (acc + x * (s-x),s) ) $ xsum' ((x+y):ys)
xsum' [] = (0,0)
xsum' [x] = (0,x)