
btw I always find it amusing to play with interact and lazy IO:
guess :: [Char] -> [String] -> [String]
guess (c:cs) ~(i:is) =
"What's your guess, heads or tails ('h' or 't')?" :
(if [c]==i then "You win!" else "You lose!") :
guess cs is
main = do
gen <- getStdGen
let rs = randomRs (0,1::Int) gen
cs = map ("ht"!!) rs
interact $ unlines . guess cs . lines
On Mon, Oct 12, 2009 at 12:24 AM, Peter Verswyvelen
It always helps to put a Debug.Trace.trace: in if trace (show (fromEnum c)) $ c == ((!!) "ht" randInt) then p
What's your guess, heads or tails ('h' or 't')? h 104 You win! What's your guess, heads or tails ('h' or 't')? *10* You lose! What's your guess, heads or tails ('h' or 't')?
So getChar also receives the linefeed character.
An easy way to get around this, is to use getLine instead and just use the first character, as in
>> fmap head getLine
But of course we're hacking away here :-)
On Mon, Oct 12, 2009 at 12:10 AM, michael rice
wrote: What is going wrong here?
Michael
=======
import System.Random
coinToss :: StdGen -> IO () coinToss gen = putStrLn "What's your guess, heads or tails ('h' or 't')?" >> getChar >>= \c -> let (randInt, _) = randomR(0,1) gen :: (Int, StdGen) in if c == ((!!) "ht" randInt) then putStrLn "You win!" else putStrLn "You lose!"
main = do gen <- getStdGen coinToss gen gen <- newStdGen main
=======
[michael@localhost ~]$ runhaskell cointoss.hs What's your guess, heads or tails ('h' or 't')? h You win! What's your guess, heads or tails ('h' or 't')? You lose! What's your guess, heads or tails ('h' or 't')? h You lose! What's your guess, heads or tails ('h' or 't')? You lose! What's your guess, heads or tails ('h' or 't')? ^Ccointoss.hs: cointoss.hs: interrupted [michael@localhost ~]$
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe