
Am Sonntag 10 Januar 2010 20:44:38 schrieb David Frey:
A couple of months ago, I was tutoring my cousin in an introductory computer science class. We talked about his assignment in which he had to implement a subset of the Battleship board game using Java.
I decided it would be fun for me to try to complete the assignment in Haskell. I forgot about the project for a while, but I picked it up and finished it today.
I have put the code on BitBucket (a Mercurial based code hosting site for those who don't know) at this location: http://bitbucket.org/dfrey/battleship/
I am hoping that some people from this list could review my code. I'm not very concerned with correctness. I'm more interested in how my code can be clarified through use of existing functions or standard Haskell idioms.
I prefer to have e.g. data BoardLocation = BoardLocation { locationRow :: Int , locationCol :: Int } deriving (Show, Eq) but that's a matter of taste. One thing that I dislike is unsignedInteger = many1 digit >>= \x -> return $ read x better is unsignedInteger = many1 digit >>= return . read , but m >>= return . f isn't good, that should be fmap f m or liftM f m , so I'd recommend unsignedInteger = fmap read (many1 digit) or, using Control.Applicative, unsignedInteger = read <$> many1 digit signedInteger could be signedInteger = do signFun <- option id (char '-' >> return negate) fmap signFun unsignedInteger it might be good to be more lenient with the format and allow more than one space between items (and trailing whitespace for user input). allPairs (x:xs) = [(x,y) | y <- xs] ++ allPairs xs
If you don't have Mercurial installed or don't want to clone the repository, you can browse the source here: http://bitbucket.org/dfrey/battleship/src/
The original PDF from my cousin's assignment can be viewed here: http://bitbucket.org/dfrey/battleship/raw/81a01574f164/Assn4.pdf
Feel free to submit your comments in any format. Patches, written comments, complete re-writes of the program, etc. are all welcome.
Thanks, David Frey