Haskell IO: Couldn't match expected type `IO a0' with actual type
haskell
Solution
`username` is a `String`, but `promptUsername` is an `IO String`. You need to do something like:
username <- promptUsername
let entry = Entry username "somepassword"
persist entry
Problem
I am new to Haskell, and I try to understand how to do IO correctly. The following works ok: ``` main = do action <- cmdParser putStrLn "Username to add to the password manager:" username <- getLine case action of Add -> persist entry where entry = Entry username "somepassword" ``` Whereas the following results in compilation error: ``` main = do action <- cmdParser case action of Add -> persist entry where entry = Entry promptUsername "somepassword" promptUsername = do putStrLn "Username to add to the password manager:" username <- getLine ``` The error is here: ``` Couldn't match expected type `IO b0' with actual type `[Char]' Expected type: IO b0 Actual type: String In the expression: username [...] ``` What is going on here? Why the first version works, while the second one does not? I know that in Stack Overflow there are a few similar questions like this, but none of them seemed to explain this problem to me.