Sono nuovo ad Haskell e cerco di capire come eseguire correttamente l'IO.I/O Haskell: Impossibile corrispondere al tipo previsto `IO a0 'con il tipo effettivo
le seguenti opere: 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"
considerando che i seguenti risultati in errore di compilazione:
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
L'errore è qui:
Couldn't match expected type `IO b0' with actual type `[Char]'
Expected type: IO b0
Actual type: String
In the expression: username
[...]
quello che sta succedendo qui? Perché la prima versione funziona, mentre la seconda non funziona?
So che in Stack Overflow ci sono alcune domande simili come questa, ma nessuna di queste sembrava spiegarmi questo problema.
Mi espanderò. Questa è do-notation che confonde uno. Il codice come 'do {a; b <- c; d b}' è in realtà una scorciatoia per 'a >> = \ _ -> c >> = \ b -> d b'. Quelli che vengono dal mondo imperativo pensano a '<-' qui come a un tipo di operatore di incarichi. Non è. Ogni riga nella notazione si traduce in una funzione anonima e '<-' contrassegna l'argomento di tale funzione. Si dovrebbe essere fortemente incoraggiati a leggere le monadi e la loro applicazione pratica per familiarizzare con loro. – permeakra
In realtà ero in grado di capire il problema e la soluzione senza conoscenza delle monadi. –