我有一个简单的Haskell函数,可以计算特定类型的总和:
usum :: Integral a => [a] -> a -> a
usum (x:xs) max = sum (nub [num*k | num <- (x:xs), k <- [1..div max num]])
在x:xs
保持不变但max
从1达到某个上限的情况下递增+1的情况下,如何运行此函数 n 次?>
如果usum
是用Java之类的面向对象语言实现的,那么我将执行以下操作:
for (int i = 0; i < limit; i++)
{
System.out.println(usum(i));
}
如何在Haskell中实现等效的for循环?
答案 0 :(得分:4)
可以通过列表[1..n]
来实现计数器。可以使用map
函数来实现循环体。结合两者,您将得到:
f xs n = map (usum xs) [1..n]
输出:
> f [1,2,3] 10
[1,3,6,10,15,21,28,36,45,55]
答案 1 :(得分:2)
您使用了usum
的列表理解来迭代k
的所有值。您也可以使用类似的方法在n
上进行迭代:
foo xs n = [usum xs m | m <- [1..n]]