module Queens where safe p n = and [ not (check (i,j) (m,n)) | (i, j) <- zip [1..lp] p ] where m = lp + 1 lp = length p check (i, j) (m, n) = j == n || i + j == m + n || i - j == m - n queens 0 = [[]] queens (m+1) = [ p ++ [n] | p <- queens m, n <- [1..8], safe p n ]