On Mar 22, 2006, at 2:16 PM, David F. Place wrote:

Hi All,

I really appreciate all the help I received when I asked you to critique my PrefixMap module a few weeks ago. I think I am making good progress in correcting the "lisp" in my Haskell programming. I'll be very grateful to anyone who can take a glance at the attached short program and say if any unidiomatic usages pop out.

sudoku :: Sudoku -> IO ()
sudoku s = ((mapM_ putStrLn) . (check s) . (take 1) . solveSudoku) s

check puzzle [] = [showSudoku puzzle,"No solutions."]
check puzzle [solution]
      | solution `solves` puzzle =
["Puzzle:",showSudoku puzzle,"Solution:",showSudoku solution]
      | otherwise = ["Program Error.  Incorrect Solution!"]


That '(check s) . (take 1)' bit looks a little odd to me. I would simply have written 'check' to match like:

check puzzle [] = <failure case>
check puzzle (solution : _ ) = <success case>


Also, I like to put off doing IO as long as possible, so I'd probably have 'sodoku' return a String or [String] and move the putStr into main. Its an easy way to make your code more reusable.

Also, your parser is pretty hackish (but I suspect you knew that already).


FYI, solveSudoku has a bug; if you enter an invalid puzzle it will return non-solutions.


It solves sudoku puzzles. (What pleasure do people get by doing these in their heads?!?)

I have no idea.


Rob Dockins

Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
          -- TMBG



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to