是否可以在列表推导中添加多个元素?

fla*_*awr 4 haskell list-comprehension

我想知道是否可以在列表理解中将多个元素添加到列表中.

例如,如果我想要一个由数字1到10组成的列表,我可以写:

[k | k <- [1..10]]
Run Code Online (Sandbox Code Playgroud)

但是,还有一种方法可以通过始终添加k k+1在同一步骤中执行此操作,并且只采用奇数k吗?以下代码无效,但可能更好地解释了我正在尝试做的事情:

[k, k+1 | k <- [1, 3..10]]
Run Code Online (Sandbox Code Playgroud)

目前,最接近这一点(我所知道的)如下:

foldl1 (++) [[k, k + 1] | k <- [1, 3..10]]
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 7

有一些替代方案,其中没有一个明显优于你的建议.

concat [ [k, k+1] | k <- [1, 3 .. 10] ]
join   [ [k, k+1] | k <- [1, 3 .. 10] ]
[ x | k <- [1, 3 .. 10], x <- [k,k+1] ]
[1, 3 .. 10] >>= (\x -> [x, x + 1])
do x <- [1, 3 .. 10] ; [x, x+1]
Run Code Online (Sandbox Code Playgroud)

请注意foldl1 (++),如在解决方案中,如果找到空列表列表,将使用运行时错误中止程序.上述替代方案没有这样的问题.

  • 另一个是`[1,3 ... 10] >> =(\ x - > [x,x + 1])`. (2认同)
  • ... 或等效地`do` `x &lt;- [1, 3 .. 10]` `[x, x+1]`。 (2认同)