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
我应该编写一个函数,其中包含之前每个乘积与该数字的乘积
基本上是这样的:
> 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