开发者

Help In Solving Problem Using Guards - UPDATED With CODE

I am using guards inside a function but not immediately after the function signature. The guards are under a do statement inside the body of the function. I get this error:

parse error on input `|'

I thought maybe the error comes from the indentation but i have tried many indentation but still i get the errors. Am asking is it because the guards are not immedaitely after the function signature that is why am getting the errors?

thanks

UPDATE 1

CODE: The user is suppose to guess a number , and the number will be compared with the random number if they are the same. If it is not correct then the user will guess till the "guess" variable in the function is zero. in every interation that value(guess) is decreased by one.

for instance : puzz 12 5. the user can guess for five times, the random number will be picked between 1 and 12. that is how the function is suppose to do, but it is not working.

puzz :: Int -> Int -> IO ()
puzz boundary guess = do
                          putStr "Guess" 
                          -- putStr  -- I have to print (1 .. guess) here in each iteration
                          putStr ":"
                          x <- randomRIO (1, boundary :: Int)
          开发者_Python百科                n <- getLine
                          let
                             nTo = read n::Int
                            in print x
                               | guess == 0 = putStr "You couldn't guess right,the   correct answer is" ++ x
                               | nTo > x = putStr "lower"
                               | nTo < x = putStr "higer"
                               | nTo == x =  putStr "Congrat, You guess right."
                               | otherwise raad boundary (guess - 1)

the ouput must be like this:

Main> puzz 50 6
Guess a number betwee 1 en 50.
Guess 1: 49
lower
Guess 2: 25
lower
Guess 3: 12
higher
Guess 4: 18
higher
Guess 5: 21
higher
Guess 6: 23
lower
You couldn't guess correct, the answer was: 22.

thanks for your help


You’re using guards incorrectly. From the report:

Top level patterns in case expressions and the set of top level patterns in function or pattern bindings may have zero or more associated guards.

So they’re only for cases and function bindings. If you just want to concisely introduce a series of true-false tests, while inside a do-notation, perhaps the case () of () trick would work:

main = do
    putStrLn "hello world"
    n <- getLine
    let nTo = read n :: Int
    case ()
      of () | cond -> putStrLn "foo"
            | cond' -> putStrLn "bar"
            | otherwise -> putStrLn "baz"


It should be noted that there are several things that are a bit off with your code, in addition to using guards wrong. By default output is buffered in haskell so if you want Guess to be on the same line as input you have to either say that stdOut should not be buffered (hSetBuffering stdOut NoBuffering), or you have to flush output with hFlush. It's not necessary to write boundary :: Int, the compiler knows it is an Int. Here is a bit more complete example, I'm sure it could be done better but atleast it works:

import Control.Monad(liftM,unless)
import System.IO(hFlush,stdout)
import System.Random(randomRIO)

guessMyNumber upper guesses = do 
  putStrLn $ "Guess a number between 1 and " ++ show upper ++ "!"
  randomRIO (1, upper) >>= puzz guesses

puzz 0 number = do
  putStrLn $ "Sorry, no more guesses, the number was " 
          ++ show number ++ "."

puzz guesses number = do  
  putStr "Guess:" >> hFlush stdout 
  guess <- liftM read getLine
  printMessage guess number guesses

printMessage guess number guesses
  | number > guess = putStrLn "higer" >> puzz (guesses-1) number  
  | number < guess = putStrLn "lower" >> puzz (guesses-1) number
  | number == guess =  putStrLn "Congratulations! You guessed right!"
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜