简体   繁体   中英

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

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 ).

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]
function xs = fst $ foldr (\x (acc,n) -> (x*n+acc,n+1)) (0,1) xs

或者更具可读性:

function = fst . foldr f (0,1) where f x (acc,n) = (x*n+acc, n+1)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM