Reputation: 21
How can I make a function similar to this but with n
being a variable with a number beginning in 1
and ending with the value of the length of xs?
For Example I want [1,2,3]
to return the result of 3*1 + 2*2 + 1*3
.
function :: [Int] -> Int
function xs = foldr (\x acc -> (x*n) + acc) 0 xs
Upvotes: 2
Views: 388
Reputation: 54574
function xs = fst $ foldr (\x (acc,n) -> (x*n+acc,n+1)) (0,1) xs
Or maybe more readable:
function = fst . foldr f (0,1) where f x (acc,n) = (x*n+acc, n+1)
Upvotes: 2
Reputation: 24759
A idiomatic Haskell answer can be:
function = sum . zipWith (*) [1 ..] . reverse
Reading from right to left: you reverse the list (reverse
), doing so you won't need to count backward (from n to 1) but forward (1 to n)... then you zip it with the index using * (zipWith (*) [1..]
) and finally sou sum things up (sum
).
Upvotes: 9
Reputation: 33637
Using zipWith
:
import Data.List
function :: [Int] -> Int
function xs = sum $ zipWith (*) xs lst
where
lst = unfoldr (\x -> Just (x-1,x-1)) $ (length xs) + 1
main = putStr $ show $ function [40,50,60]
Upvotes: 5