[ACCEPTED]-Haskell IO: Couldn't match expected type `IO a0' with actual type-haskell
username
is a String
, but promptUsername
is an IO String
. You need to do something 1 like:
username <- promptUsername
let entry = Entry username "somepassword"
persist entry
Here's another variant.
main = do
action <- cmdParser
case action of
Add -> do username <- promptUsername
let entry = Entry username "somepassword"
persist entry
promptUsername :: IO String
promptUsername = do
putStrLn "Username to add to the password manager:"
getLine
-- fake definitions to make things compile
persist :: Entry -> IO ()
persist = print
cmdParser :: IO Add
cmdParser = fmap (const Add) getLine
data Add = Add deriving Show
data Entry = Entry String String deriving Show
The problem is 11 just that promptUsername
is an action not a String. The action 10 'returns a String', so it has type IO String
, but 9 it is itself nothing like a String. Since 8 Entry x y
requires a String
in the x position, something 7 in the shape of an action could no more fit there 6 than a number or boolean could. So in defining 5 your complex action, main
, you must 'extract' the 4 string that will result from the simpler 3 action promptUsername
in any case of execution, and give 2 the String
as the first argument the entry. Then 1 you do the persist
action on the resulting Entry
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.