haskellで組合せと順列

まさか… そんなまさか… さっき id:nobsun さんに教えてもらった

[(i,j)|i<-[1..10],j<-[i+1..10]]

が組合せだったなんて…

Prelude> mapM_ print $ map (\x->[(i,j)|i<-[1..x],j<-[i+1..x]]) [2..6]
[(1,2)]
[(1,2),(1,3),(2,3)]
[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
[(1,2),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5),(3,4),(3,5),(4,5)]
[(1,2),(1,3),(1,4),(1,5),(1,6),(2,3),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6)]

そりゃ、haskellのData.Listにcombinationsがないはずだ…

ちなみに3項だと

Prelude> mapM_ print $ map (\x->[(i,j,k)|i<-[1..x],j<-[i+1..x],k<-[j+1..x]]) [3..5]
[(1,2,3)]
[(1,2,3),(1,2,4),(1,3,4),(2,3,4)]
[(1,2,3),(1,2,4),(1,2,5),(1,3,4),(1,3,5),(1,4,5),(2,3,4),(2,3,5),(2,4,5),(3,4,5)]


やべえ、もしかして順列もこれでできる?5P2は…

Prelude> [(i,j)|i<-[1..5],j<-[1..5],i/=j]
[(1,2),(1,3),(1,4),(1,5),(2,1),(2,3),(2,4),(2,5),(3,1),(3,2),(3,4),(3,5),(4,1),(4,2),(4,3),(4,5),(5,1),(5,2),(5,3),(5,4)]
Prelude> length [(i,j)|i<-[1..5],j<-[1..5],i/=j]
20

単なる直積の重複排除かよorz
まあ、項数限定だからpermutationsにはそれなりに意味があるな。

ちなみに以下の二つも同じだな。でもたぶん下の方が速い。haskellのtime関数がわからない…

Prelude> length [(i,j)|i<-[1..100],j<-[1..100],i<j]
4950
Prelude> length [(i,j)|i<-[1..100],j<-[i+1..100]]
4950