Condition in do block

haskell, io

Solution

Both branches of an `if then else` must have the same type, but

runTestTT tests :: IO Counts

and

print $ process seq :: IO ()

You can add a `return ()` to the `then` branch, the modern way to do that is to use `Control.Monad.void`,

main = do
    line <- getLine
    if null line
        then void (runTestTT tests)         -- formerly: runTestTT tests >> return ()
        else do
            line2 <- getLine
            seq::[Int] <- return $ map read $ words line2
            print $ process seq

to fix it (or you could add a `return some_value_of_type_Counts` to the `else` branch).

Problem

Why does the following block of code: ``` main = do line <- getLine if null line then runTestTT tests else do line2 <- getLine seq::[Int] <- return $ map read $ words line2 print $ process seq ``` throw an error: ``` lgis.hs:28:13: Couldn't match type `()' with `Counts' Expected type: IO Counts Actual type: IO () In a stmt of a 'do' block: print $ process seq In the expression: do { line2 <- getLine; seq :: [Int] <- return $ map read $ words line2; print $ process seq } In a stmt of a 'do' block: if null line then runTestTT tests else do { line2 <- getLine; seq :: [Int] <- return $ map read $ words line2; print $ process seq } ``` Even though both: ``` main = do runTestTT tests ``` and ``` main = do line <- getLine line2 <- getLine seq::[Int] <- return $ map read $ words line2 print $ process seq ``` work fine?

Original source