2016-05-01 80 views
2

我想知道是否可以將多個元素添加到列表理解中的列表中。是否可以在列表理解中添加多個元素?

舉例來說,如果我想由數字1到10的名單,我可以這樣寫:

[k | k <- [1..10]] 

然而,就是有也是一種通過一直在增加kk+1做到這一點同一步,只需要奇數k?下面的代碼是無效的,但也許是更好的解釋什麼,我試圖做的:

[k, k+1 | k <- [1, 3..10]] 

目前,最接近這個(即我所知道的)如下:

foldl1 (++) [[k, k + 1] | k <- [1, 3..10]] 

回答

6

有一些替代方案,其中沒有哪一個比您提出的要好得多。

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] 

注意foldl1 (++),在您的解決方案,將中止程序與運行時錯誤,如果它發現一個空列表-的名單。上述替代品沒有這樣的問題。

+0

謝謝你的回答並提供替代品! – flawr

+2

另一個是'[1,3,10] >> =(\ x - > [x,x + 1])'。 – Jubobs

+1

......或等同於'do'' x < - [1,3..10]''[x,x + 1]'。 – leftaroundabout

相關問題