Haskell foldr乘法

时间:2015-12-12 00:26:41

标签: haskell fold

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

基本上这个:

> 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的第一个元素相乘(负责人没有工作)

3 个答案:

答案 0 :(得分:4)

productFromLeftToRight = scanr1 (*)

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

答案 1 :(得分:2)

productFromLeftToRight nums =
    init $ foldr (\x lst -> x * head lst : lst) [1] nums

这个想法是在答案列表中使用虚拟元素1并最终删除它。

答案 2 :(得分:0)

这是另一个在foldr

之后不进行任何后处理的人
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
相关问题