在Haskell中将列表元素相乘

时间:2013-05-11 23:18:43

标签: list haskell product

我想要一个能够获取列表内容的产品并复制其元素的函数。

例如,列表为:[2, 3, 4, 5]

其内容的产品:[1, 2, 6, 24, 120]

最后,列表应如下所示:[1, 1, 2, 2, 2, 6, 6, 6, 6, 24, 24, 24, 24, 24]

我的问题是[1, 2, 6, 24, 120]不应该变化,但我无法解决它,我对haskell很新。您无需修改​​此代码,您可以创建一个新代码。

makeSystem :: Integral a => [a] -> [a]
makeSystem l= replicate (l !! 0) ((map product(inits l))!!0) ++ asd (tail l) where
 inits [] = [[]]
 inits (x:xs) = [[]] ++ map (x:) (inits xs)

另一个例子:makeSystem [5,2,5,2,5,2]

结果:[1, 1, 1, 1, 1, 5, 5, 10, 10, 10, 10, 10, 50, 50, 100, 100, 100, 100, 100, 500, 500]

1 个答案:

答案 0 :(得分:12)

对于第一部分,您可以使用标准函数scanl

> scanl (*) 1 [2, 3, 4, 5]
[1,2,6,24,120]

对于第二部分,带有zipWithreplicate让我们大部分时间都在那里:

> zipWith replicate [2, 3, 4, 5] [1, 2, 6, 24, 120]
[[1,1],[2,2,2],[6,6,6,6],[24,24,24,24,24]]

然后我们只需要concat这些列表。

全部放在一起:

> let makeSystem xs = concat $ zipWith replicate xs (scanl (*) 1 xs)
> makeSystem [2, 3, 4, 5]
[1,1,2,2,2,6,6,6,6,24,24,24,24,24]
> makeSystem [5, 2, 5, 2, 5, 2]
[1,1,1,1,1,5,5,10,10,10,10,10,50,50,100,100,100,100,100,500,500]