2013-05-11 94 views
3

我想要一个函数,它使用列表的inits和重复其元素的乘积。Haskell中的列表元素相乘

例如,列表是:[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]不应该改变,但我不能解决它,我对哈斯克尔很新。你不需要修改这段代码,你可以创建一个新的代码。

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]

回答

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] 
+1

感谢您的快速答复!这解决了我的问题。 – user2373887 2013-05-11 23:43:53