Rance
Rance

Reputation: 21

haskell foldr and variable

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

Answers (3)

Landei
Landei

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

Nicolas
Nicolas

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

Ankur
Ankur

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

Related Questions