Haskell Sudoku solver
cs.tufts.edu
cs.tufts.edu
Haskell is consise in the sense that you can accomplish a lot with small definitions - as you'll note, many of those functions are one-liners and exist solely to give meaning/value to something that is otherwise unclear. Even if the definition is used only once (or never used at all), it's well worth doing just for clarity and reusability's sake.
That being said, there are a few warts in there - basically anything to do with the "boxes" I had to do a lot of repetitive ugly lines. I could probably have changed the structure of the grid to denote boxes, but this was a learning experience.
(edit: re: the logic and everything, it's all explained at the bottom of the readme though I'd be happy to expound upon it)
I'd use pointless style more: row = (!!)
The function valid has a lot of repetition, maybe the repeating part can be abstracted of?
Instead of length possible > 0, you can use not $ null possible. This is faster, since it doesn't go through the whole list.
Instead of pattern matching on Maybe (tile), you can use Prelude's maybe.