list - Haskell 中的列表元素相乘

标签 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]

最佳答案

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

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

对于第二部分, zipWith replicate 让我们完成大部分工作:
> 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 这些 list 。

把它们放在一起:
> 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]

关于list - Haskell 中的列表元素相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502624/

相关文章:

c# - 字典列表与嵌套字典

python - 将字符串转换为二元组列表

python - 如何将列表 "one by one"写入 python 中的二进制文件?

haskell - 为什么 Applicative 应该是 Monad 的父类(super class)?

c# - 替换字符串列表中元素的一部分

haskell - 将源的输出合并到流中

Peter Norvig 的拼写校正器的 Haskell 版本慢得令人难以置信

php - 在 Woocommerce 中显示特定产品类别的产品

php - MySQL 搜索查询 - "Keep"不工作

product - Atlassian Stash 是否提供类似 Pastebin/GitHub gist 的功能?