List 将列表中的所有数字相乘-Haskell
我是haskell的新手,我想将数组中的所有数字相乘。例如: 数组:List 将列表中的所有数字相乘-Haskell,list,haskell,List,Haskell,我是haskell的新手,我想将数组中的所有数字相乘。例如: 数组: [3,2,4] //3*2*4 输出 24 谢谢,非常感谢您的帮助 您可以使用折叠功能执行此操作: foldr (*) 1 [2,3,4] 或者 在Haskell中有很多方法可以做到这一点。 例如,您可以使用: product [3,2,4] 或同等地 foldr (*) 1 [3,2,4] 或递归地: prod [] = 1 prod (x : xs) = x * prod xs 函数foldr就是所谓的
[3,2,4] //3*2*4
输出
24
谢谢,非常感谢您的帮助 您可以使用折叠功能执行此操作:
foldr (*) 1 [2,3,4]
或者
在Haskell中有很多方法可以做到这一点。 例如,您可以使用:
product [3,2,4]
或同等地
foldr (*) 1 [3,2,4]
或递归地:
prod [] = 1
prod (x : xs) = x * prod xs
函数foldr
就是所谓的列表。要理解foldr,我们首先需要理解列表构造函数。在Haskell中,[3,2,4]
是3:2:4:[]
的语法糖,其中:
是列表构造函数,[]
是空列表。应用程序foldr f v
按函数f
替换列表中出现的:
,并替换v
的空列表。其定义如下:
foldr :: (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
作为例子,考虑<代码> FordR(*)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
产品
功能正是您想要的。它还有一个特性,
product[]
等于1,这在数学上是可以预期的
如果你看一下它的定义,你会发现,
product
确实是乘法的倍数(以1作为中性元素)。谢谢你的回答,你能解释一下foldr函数的作用吗?我编辑了答案来解释foldr函数。希望它能帮助你。
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