借鉴Hammar的回答:他的方法似乎很容易扩展到更高的维度:
Prelude> import Data.List.Ordered
Prelude Data.List.Ordered> import Data.Ord
Prelude Data.List.Ordered Data.Ord> let norm (x,y,z) = sqrt (fromIntegral x^2+fromIntegral y^2+fromIntegral z^2)
Prelude Data.List.Ordered Data.Ord> let mergeByNorm = mergeAllBy (comparing norm)
Prelude Data.List.Ordered Data.Ord> let sorted = mergeByNorm (map mergeByNorm [[[(x,y,z)| x <- [0..]] | y <- [0..]] | z <- [0..]])
Prelude Data.List.Ordered Data.Ord> take 20 sorted
[(0,0,0),(1,0,0),(0,1,0),(0,0,1),(1,1,0),(1,0,1),(0,1,1),(1,1,1),(2,0,0),(0,2,0),(0,0,2),(2,1,0),(1,2,0),(2,0,1),(0,2,1),(1,0,2),(0,1,2),(2,1,1),(1,2,1),(1,1,2)]
for (sum = 1; ; ++sum) for (i = 1; i < sum; ++i) print (i, sum - i);
- Kerrek SB[(x, s-x) | s <- [0..], x <- [0..s]]
的意思是生成一个无限长的列表,其中每个元素都是二元组(x, s-x)
,满足s
从0
开始递增,x
在0
到s
之间取值。 - hammar