Sli*_*ton 7 haskell list-comprehension
我一直在使用以下代码来获取预定数量的所有组合:
getList x = [ [a,b,c] | a <- [1..x], b <- [1..x], c <- [1..x]]
Run Code Online (Sandbox Code Playgroud)
这开始很好,但我希望扩展程序来处理非常大的列表,我一直认为必须有更好的方法来做到这一点.我如何创建一个与此处采用相同参数x的函数,以及该子列表具有多少项的另一个参数.对于四个项目,我会去修改代码:
getList x = [ [a,b,c,d] | a <- [1..x], b <- [1..x], c <- [1..x], d <- [1..x]]
Run Code Online (Sandbox Code Playgroud)
它不需要是列表理解.感谢您的任何帮助.
C. *_*ann 17
我相信你想要的是它的replicateM
功能Control.Monad
.
列表monad基于"尝试所有可能的组合",而plain replicate
通过重复项目多次来创建列表.因此replicateM
,给定一些可能值的列表,结果是列出了从该列表中选择项目的所有可能方式的次数.
例如:
> replicateM 2 [0, 1]
[[0,0],[0,1],[1,0],[1,1]]
> replicateM 3 [0, 1]
[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
Run Code Online (Sandbox Code Playgroud)
因此,要将函数扩展为任意重复,您可以使用以下内容:
getListN n x = replicateM n [1..x]
Run Code Online (Sandbox Code Playgroud)
...你的原件getList
相当于getListN 3
.