While loop in Haskell with a condition
haskell, loops, while-loop
Solution
import Control.Monad
while :: (a -> Bool) -> (a -> IO a) -> a -> IO a
while praed funktion x
| praed x = do
y <- funktion x
while praed funktion y
| otherwise = return x
power2 :: IO ()
power2 = do
putStr "Please enter a number."
i <- getChar
let praed x = x /= ' '
let f x = do
putChar x
getChar
while praed f '?'
return ()
Some notes:
- Using `if x then True else False` is redundant, it's equivalent to just `x`.
- Similarly `if x == True ...` is redundant and equivalent to `if x ...`.
You need to distinguish between `IO` actions and their results. For example, if yo do
do
i <- getChar
...
then in ... `i` represents the result of the action, a character, so `i :: Char`. But `getChar :: IO Char` is the action itself. You can view it as a recipe that returns `Char` when performed. You can pass the recipe around to functions etc., and it is only performed when executed somewhere.
Your `while` called `funktion` twice, which probably isn't what you intend - it would read a character twice, check the first one and return the second one. Remember, your `funktion` is an action, so each time you "invoke" the action (for example by using `<- funktion ...` in the `do` notation), the action is run again. So it should rather be something like
do
y <- funktion x
f <- praed y
-- ...
(My code is somewhat different, it checks the argument that is passed to it.)
Problem
I'm having a little Haskell Situation over here. I'm trying to write two functions with monads. First one is supposed to iterate through a function as long as the condition is true for the input / output of the function. Second one is supposed to use the first one to take a number as input and write it as output until you enter a space. I'm stuck with this, any help? ``` module Test where while :: (a -> Bool) -> (a -> IO a) -> a -> IO a while praed funktion x = do f <- praed (funktion x) if f == True then do y <- funktion x while praed funktion y else return x power2 :: IO () power2 = do putStr (Please enter a number.") i <- getChar while praed funktion where praed x = if x /= ' ' then False else True funktion = i ```