『入門Haskell』練習問題例解(9)
p.87の練習問題です。「格子点の列挙問題」と言うそうです。
lattice関数を改良し、現在の2次元格子点限定から任意のn次元格子点に対応するように
Integer -> Integer -> [[Integer]]の型を持つようにしなさい。また、それを利用してall_latticeもn次元格子点をすべて順番に列挙するように改良しなさい。
要するに直積集合の要素をすべて列挙せよ、ということです。ただし、タプルではなくリストを使います。
lattice 1 n = [[n]] lattice d n = concat [map (i:) (lattice (d-1) (n-i)) | i <- [0..n]] all_lattice d = concat [lattice d i | i <- [0..]]
こうなると思います。