main =  do      let b = 0
                let c = randomRIO (1,2)
                until (c == 1)  increment b
                return b

This is intended to print the number of consecutive heads (i.e., 2) before
the first tail, but I get the following error:

ERROR "StPetersburg.hs":8 - Type error in application
*** Expression     : until (c == 1) increment b
*** Term           : c == 1
*** Type           : Bool
*** Does not match : Int -> Bool

I don't really see what's going on, so any help will be more than welcome.
I hope this is a suitable question for the Haskell Café list.

I'm not familiar with the problem, so I won't comment on how I would implement it. However what you appear to be doing is trying to write something in an imperative style.

If you want to generate random coin tosses and count how many are heads, I suggest you write a function that returns an infinite list of coin toss results. Something like

tosses :: IO ([Int])
tosses = do ts <- tosses
            return (randomRIO (1,2):ts)

Then your main function merely needs to count them:

main = do ts <- tosses
          return $ countHeads ts

countHeads = if (head fg == 1) then 0 else length fg where fg = head $ group ts

Your immediate error is caused by a misunderstanding of how until works.

Until essentially is a restricted while loop implemented with recursion. It takes three things:
1) A condition for stopping looping
2) A thing to do in the loop
3) A value to start with.

Because there's no mutable state, a while loop can't alter the program state, so we must do something else instead. What we do is we have a function for computing whether we're done looping or not, and we pass a value into it. _______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to