将列表中的所有数字相乘 - Haskell

时间:2016-05-27 22:47:29

标签: list haskell

我是haskell的新手,想要将数组中的所有数字相乘。例如。:

阵列:

[3,2,4]   //3*2*4

输出

24 

谢谢,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

在Haskell中有很多方法可以做到这一点。 例如,您可以使用:

product [3,2,4]

或等效

foldr (*) 1 [3,2,4]

或递归:

prod [] = 1
prod (x : xs) = x * prod xs 

函数foldr是所谓的列表catamorphism。要理解foldr,我们需要首先理解列表构造函数。在Haskell中,[3,2,4]3 : 2 : 4 : []的语法糖,其中:是list-cons构造函数,[]是空列表。应用foldr f v替换按功能:列出的f中的每一个vfoldr :: (a -> b -> b) -> b -> [a] -> b foldr f v [] = v -- equation 1 foldr f v (x:xs) = f x (foldr f v xs) -- equation 2 的空列表。其定义如下:

foldr (*) 1 [3,2,4]

例如,请考虑foldr (*) 1 [3,2,4] = 3 * (foldr (*) 1 [2,4]) = (by equation 2 of foldr) 3 * (2 * (foldr (*) 1 [4])) = (by equation 2 of foldr) 3 * (2 * (4 * (foldr (*) 1 []))) = (by equation 2 of foldr) 3 * (2 * (4 * 1)) = (by equation 1 of foldr) = 24

objOne={ example1:"example1 data" example2:"example2 data"};

objtwo={ example3:"example3 data" example4:"example4 data"};

答案 1 :(得分:1)

您可以使用折叠功能:

foldr (*) 1 [2,3,4]

...或

foldr1 (*) [2,3,4]

答案 2 :(得分:1)

product功能正是您所需要的。
它还具有product []等于1的特征,正如您在数学上所期望的那样。

如果你看一下它的定义,你可以看到product确实是乘法的 fold (1为中性元素)。