Soy nuevo en Haskell, y trato de entender cómo hacer IO correctamente.Haskell IO: No se pudo encontrar el tipo esperado `IO a0 'con el tipo real
las siguientes obras: 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 que los siguientes resultados en error de compilación:
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
el error está aquí:
Couldn't match expected type `IO b0' with actual type `[Char]'
Expected type: IO b0
Actual type: String
In the expression: username
[...]
lo que está pasando aquí? ¿Por qué funciona la primera versión, mientras que la segunda no?
Sé que en Stack Overflow hay algunas preguntas similares a esta, pero ninguna de ellas me explicó este problema.
Voy a expandir. Esto es notación de do confunde uno. El código como 'do {a; b <- c; d b}' es en realidad una abreviatura de 'a >> = \ _ -> c >> = \ b -> d b'. Los que vienen del mundo imperativo piensan en '<-' aquí como una especie de operador de asignación. No lo es. Cada línea en notación do se traduce en función anónima, y '<-' marca el argumento de dicha función. Se debe animar a alguien a leer sobre las mónadas y su aplicación práctica para familiarizarse con ellas. – permeakra
Pude entender el problema y la solución sin conocimiento de mónadas. –