使用foldl计算乘积和

Using foldl to calculate the product sum

基本上,我想用下面的算法计算一个列表:

myList = [a1, a2, a3, ... a8] -- 所有元素都是 Int

result = a[n] * n(其中 n 是从 0 开始的索引)

结果=a1*0+a2*1+a3*2....+a8*7

下面的代码有效。

prodSum xs = helper 0 xs
    where helper a (x:xs) = 
              let a' = (a + 1)
              in a * x + helper a' xs
          helper a _ = 0

然而,我被要求使用foldl来实现它,我尝试了但没有成功。谁能提出解决方案?

为了只用 foldl 做到这一点,我们需要考虑在遍历列表时需要保持什么状态。

在这种情况下,我们需要当前项目的索引(从 0 开始)和当前总和(也从 0 开始)。我们可以将它们都存储在一个元组中。

在每一步中,我们将当前索引乘以当前值相加到总和中,并将索引递增 1。

foldl 完成后,我们可以丢弃索引和 return 总和。

Prelude> prodSum = fst . foldl (\(sum, i) x -> (sum + x * i, i + 1)) (0, 0)
Prelude> prodSum [1..2]
2
Prelude> prodSum [1..5]
40
Prelude> prodSum [1..8]
168