2016-10-22 57 views
1
sorteerOpY :: (Int, Int) -> [[(Int, Int)]] 
sorteerOpY (x,y) = [[(a,b)]|b<-[0..y-1],a<-[0..x-1]] 

這就是我現在所擁有的,sorteerOpY (2,3)結果:如何創建按第二個元素排序並分組的對列表的列表?

[[(0,0)],[(1,0)],[(0,1)],[(1,1)],[(0,2)],[(1,2)]] 

但是,這是我想它會導致什麼:

[[(0,0),(1,0)],[(0,1),(1,1)],[(0,2),(1,2)]] 

什麼我需要改變,使我的列表被正確創建?

+0

將'[[(a,b)] | b < - [0..y-1],a < - [0..x-1]]'改成'[[(a,b)| a < - [0..x-1]] | b < - [0..y-1]]' – Alec

+0

謝謝!我看到你在那裏做了什麼,現在看起來非常容易,我不敢相信我一直在爲此而頭痛。 – ergoforce

+0

不用擔心!很高興有幫助。 :) – Alec

回答

1

你能想到的列表內涵爲[[(a, b) | b <- [0..y-1]]| a<-[0..x-1]]這樣的:

for every b <- [0..y-1]  
    xs <- for every a <- [0..x-1] 
     add (a, b) to the resulting list 
    add xs to the resulting list 

所以,如果a(a, b)應該改變更快,你需要更換這些線路:

for every a <- [0..x-1] 
    xs <- for every b <- [0..y-1] 
     add (a, b) to the resulting list 
    add xs to the resulting list 

這直接導致[[(a,b) | a <- [0..x-1]]| b <- [0..y-1]]

+0

我想你已經誤解了這個問題,看看亞歷克的評論,因爲那符合我的想法。 – ergoforce

+0

@ergoforce哎呦。你是對的。昨天我有些匆忙,錯過了嵌套的列表理解。 – Zeta

相關問題