Haskell 带乘法的文件夹

Haskell foldr with multiplication

我应该编写一个函数,其中包含之前每个乘积与该数字的乘积

基本上是这样的:

> productFromLeftToRight [2,3,4,5]
[120,60,20,5]

我应该使用高阶函数,所以折叠等等。我正在考虑使用 foldr 通过 lambda 表达式遍历列表。这就是我的想法:

> productFromLeftToRight nums = foldr (\x acc -> [x] * acc ++ acc) [] nums

因为它会像 f(2 (f 3 (f 4 (f 5 [])))) 一样解开 我认为我是对的,但我得到了整个打印错误,我不知道如何将数字与 acc 的第一个元素相乘( head acc不起作用)

productFromLeftToRight = scanr1 (*)

productFromLeftToRight' = 
  snd . foldr (\x (acc,lst) -> (x * acc, x * acc : lst)) (1,[])
productFromLeftToRight nums =
    init $ foldr (\x lst -> x * head lst : lst) [1] nums

想法是在答案列表中使用虚拟元素 1 并在最后将其删除。

这是另一个在 foldr 之后不进行任何 post 处理的方法:

productFromLeftToRight = foldr (\n ps -> n * foldr const 1 ps : ps) []

这里,内部 foldr const 1 作为一个非部分 head 函数来获取 ps 的第一个元素:

foldr const 1 (x:xs) = const x (foldr const 1 xs) = x
foldr const 1 []     = 1