2010-12-09 5 views
1

Ich benutze Wachen innerhalb einer Funktion, aber nicht unmittelbar nach der Signatur der Funktion. Die Wachen sind unter einer do Aussage innerhalb des Körpers der Funktion. Ich bekomme diese Fehlermeldung:Hilfe bei der Lösung von Problemen mit Guards - AKTUALISIERT mit CODE

parse error on input `|' 

Ich dachte, vielleicht der Fehler aus der Vertiefung kommt, aber ich habe viel Einbuchtung versucht, aber ich bekomme immer noch die Fehler. Ich frage, ist es weil die Wachen nicht sofort nach der Funktionssignatur sind, warum bekomme ich die Fehler?

dank

UPDATE 1

Code: Der Benutzer wird angenommen, um eine Zahl zu erraten, und die Zahl wird mit der Zufallszahl verglichen werden, wenn sie die gleichen sind. Wenn es nicht korrekt ist, wird der Benutzer raten, bis die Variable "raten" in der Funktion gleich Null ist. in jeder Interaktion wird dieser Wert (rate) um eins verringert.

zum Beispiel: puzz 12 5. der Benutzer kann fünf mal erraten, die Zufallszahl wird zwischen 1 und 12 gewählt. Das ist, wie die Funktion tun soll, aber es funktioniert nicht.

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) 
          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) 

die ouput muss so sein:

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. 

Dank für Ihre Hilfe

+0

Sie scheinen ein großes Missverständnis in Bezug auf was Wachen sind. Wenn Sie Ihren Code gepostet haben, könnten wir sehen, was Sie erreichen möchten, und dieses Missverständnis aufklären. –

Antwort

1

Es soll beachtet werden, dass es mehr Dinge, die ein bisschen ausgeschaltet sind mit Ihrem Code, zusätzlich zur Verwendung von Wachen falsch. Standardmäßig wird die Ausgabe in haskell gepuffert. Wenn Sie möchten, dass Guess in derselben Zeile wie die Eingabe ist, müssen Sie entweder sagen, dass stdOut nicht gepuffert werden soll (hSetBuffering stdOut NoBuffering), oder Sie müssen die Ausgabe mit hFlush leeren. Es ist nicht notwendig, boundary :: Int zu schreiben, der Compiler weiß, dass es ein Int ist. Hier ist ein bisschen vollständiger Beispiel, ich bin mir sicher, es könnte besser gemacht werden, aber zumindest funktioniert es:

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

danke für deine antwort – kap

5

Sie Wachen falsch verwenden. 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 sind sie nur für Fälle und Funktion Bindungen. Wenn Sie nur knapp eine Reihe von Wahr-Falsch-Tests einführen wollen, während in einer do-Notation, vielleicht der case() of() Trick funktionieren würde:

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