『入門Haskell』練習問題例解(9)

p.87の練習問題です。「格子点の列挙問題」と言うそうです。

lattice関数を改良し、現在の2次元格子点限定から任意のn次元格子点に対応するように

Integer -> Integer -> [[Integer]]

の型を持つようにしなさい。また、それを利用してall_latticeもn次元格子点をすべて順番に列挙するように改良しなさい。

要するに直積集合N^{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..]]

こうなると思います。