我被要求制作一个计算类似
之类的haskell函数1^2 + 2^2 + 3^2 ...
虽然我发现使用列表推导很容易实现
sum [ k^2 | k <- [1..100]]
或地图
sum (map (\x -> x*x) [1..100])
我很难用折叠来实现它。
如果我没有错,那么在递归函数中需要不少于3个参数来实现这样的结果:
即使我定义了这个函数,它仍然会返回一个元组,而不是一个数字(就像我需要它一样!)。
有没有人可以给我一些关于我可能遗失的线索?
由于
答案 0 :(得分:6)
如果你看一下sum
的定义,它只是sum = foldl (+) 0
。因此,如果您在任一解决方案中将sum
替换为foldl (+) 0
,则可以使用foldl
获得解决方案。
你也可以通过使用map
来添加列表推导或foldl
的需要,该函数将第二个参数的平方加到第一个参数上。
我不确定你对递归函数的考虑在哪里。如果您正在使用foldl
,则不需要使用递归(除非到目前为止使用递归实现foldl
)。
但是,你错误的是递归函数需要三个参数:一个递归函数对列表中每个元素的平方进行求和,最简单的方法是通过获取一个列表并将列表的头部添加到结果中来实现调用列表尾部的函数。基本情况为squareSum [] = 0
。但这与foldl
无关。
答案 1 :(得分:5)
“当前位置”(实际上是列表中的下一个项目,就像在地图和列表推导版本中一样)和停止的位置隐藏在折叠的列表中。当前总和是折叠的“累加器”参数。所以,填写空白:
foldl (\runningSum nextNumber -> ____) 0 [1..100]