I just started Haskell and it completely confuses me. I did Java and Python before which made a lot more sense to me.

I'm currently trying to get a user input, check if it is valid, if not: print an error and get the input again; if valid: produce a a boolean value from it.

To be more precise, I want a yes/no input, where 'y' will produce True, 'n' will produce False, and any other input will print a message into the command line and ask to input y/n again.

E.g.:

Continue? y/n:
> assd
Invalid input.
Continue? y/n:
> y
(something happens)
Continue? y/n:
> n
(Close program)

Writing it in farmiliar format, a function like this:

boolean inputBool() {
    while(True) {
       str = input("Continue? y/n: ");
       if (str == "y") {
           return True;
       } else if (str == "n") {
           return False;
       } else {
           print("Invalid input");
       }
}

--main program--

while(inputBool()) {
    doSomething();
}

Since I just started haskell (today actually), I don't have much of an idea what I can or can't do. I was thinking of something similar to:

yesno :: Bool
yesno = do
        putStr "Continue? y/n: " 
        str <- readLn
        if (str == "y") then True else (
            if (str == "n") then False else (
                do
                putStrLn "Invalid input."
                yesno
            )    
        )

Which doesn't work for many reasons. My main problem is that I don't know what this "do" does. I just read it's used when needing io operations and somehow executes the following expressions. Which doesn't make sense to me after reading that in haskell everything evaluates to a value. What does "do" evaluate to? Also, what indentation is expected? It seems to be kind of random. I know that the function has to evaluate to my boolean value, which doesn't seem to be possible with using this "do" o

Edit
Report