在Haskell中列出理解

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.