# [Haskell] Animal guessing game - critique my code

JTXX jtxx000 at yahoo.co.uk
Sat Oct 28 20:04:00 EDT 2006

Hello everybody.

I'm trying to learn Haskell, and so I implemented the
classic animal guessing game.  However, I feel that
there is probably a more elegant implementation than
the one shown below, so any suggestions for
improvement would be great.

Cheers,
Caleb

\begin{code}
| GuessTreeQuestion {guessTreeQuestion
:: String, guessTreeNo, guessTreeYes ::GuessTree}

askQuestion :: String -> IO Bool
putStrLn str
response <- getLine
return $isYes response where isYes ('y':xs) = True isYes _ = False runTree :: GuessTree -> IO GuessTree runTree (Answer name) = do response <- askQuestion$ "Is it a " ++ name ++ "?"
if response
then do putStrLn "Ha!"
return $Answer name else do putStrLn "What is it?" animal <- getLine putStrLn$ "Enter a question to help
distinguish between a " ++ name ++ " and a " ++ animal
question <- getLine
a <- askQuestion $"Is the answer yes for " ++ animal ++ "?" (if a then id else flip) (\n y -> return$
GuessTreeQuestion {guessTreeQuestion = question,
guessTreeNo = n, guessTreeYes = y}) (Answer animal)
runTree GuessTreeQuestion {guessTreeQuestion = ques,
guessTreeYes = yesTree, guessTreeNo = noTree} = do
response <- askQuestion $ques if response then do a <- runTree noTree return$ GuessTreeQuestion
{guessTreeQuestion = ques, guessTreeNo = a,
guessTreeYes = yesTree}
else do a <- runTree yesTree
return $GuessTreeQuestion {guessTreeQuestion = ques, guessTreeNo = noTree, guessTreeYes = a} run :: GuessTree -> IO GuessTree run tree = do putStrLn "Think of an animal and press enter." getLine a <- runTree tree r <- askQuestion "Play again?" if r then run a else return a main = run$ Answer "bear"
\end{code}

Send instant messages to your online friends http://uk.messenger.yahoo.com