Я новичок в Haskell, и я стараюсь понять, как правильно выполнить IO.Haskell IO: Не удалось совместить ожидаемый тип `IO a0 'с фактическим типом
Следующие работает нормально:
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"
Принимая во внимание следующие результаты в ошибке компиляции:
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
Ошибка находится здесь:
Couldn't match expected type `IO b0' with actual type `[Char]'
Expected type: IO b0
Actual type: String
In the expression: username
[...]
Что здесь происходит? Почему работает первая версия, а вторая - нет?
Я знаю, что в переполнении стека есть несколько подобных вопросов, подобных этому, но ни один из них, казалось, не объяснил мне эту проблему.
Я расширю. Это недоразумение. Код типа 'do {a; b <- c; d b}' на самом деле является сокращением для 'a >> = \ _ -> c >> = \ b -> d b'. Те, кто пришел из императивного мира, думают о '<-' здесь как о своем назначении. Это не. Каждая строка в do-notation преобразуется в анонимную функцию, а '<-' отмечает аргумент такой функции. Нужно настоятельно рекомендовать читать о монадах и их практическом применении, чтобы ознакомиться с ними. – permeakra
Я действительно смог понять проблему и решение без знания монадов. –