Sudoku solver from chapter 5 of "Thinking Functionally with Haskell"