Solution
= Solution
Enumerate assignments and retain exactly the valid completions:
``
solve :: Grid -> [Grid]
solve = filter complete . expand . choices
``
With $x$ blank cells and all other entries fixed, the unpruned <Cartesian product> has \b[$9^x$ candidate grids]. Testing `complete` enforces every row, column and box condition. This is the size of the full candidate search; <lazy evaluation> can stop earlier if the caller demands only an initial portion of the solution list.