уверен просто использовать другую функцию, где вы можете использовать аргументы по своему выбору:
ask :: String -> IO()
ask lastAge = do
-- don't know what you want to do with lastAge
-- so I just use it when the user did not enter anything
putStrLn "Hey there, what's your name and age?"
name <- getLine
age' <- getLine
let age = if null age' then lastAge else age'
putStrLn ("Hi " ++ name ++ " you are " ++ age ++ " years old!")
ask age
main :: IO()
main = ask ""
позволяют мне представить небольшое улучшение: вероятно, вы не хотите бесконечный цикл здесь вы можете легко избавиться от него, используя unless:
import Control.Monad (unless)
ask :: String -> IO()
ask lastAge = do
-- don't know what you want to do with lastAge but here you have it
putStrLn "Hey there, what's your name and age?"
name <- getLine
unless (null name) $ do
age' <- getLine
let age = if null age' then lastAge else age'
putStrLn ("Hi " ++ name ++ " you are " ++ age ++ " years old!")
ask age
это остановит цикл, как только пользователь не даст свое имя.
Спасибо за вашу помощь, но это не то, что я хочу. Если я не буду вводить имя и только возраст, то не должно быть выхода. Затем, когда я ввожу имя и возраст в следующий раз, результатом должно быть введенное имя и возраст, который был введен ранее. –
well tbh: Я не знаю точно, что вы пытаетесь сделать (на ваш вопрос указано иначе) - но фрагмент должен быть легко адаптирован - вы только просили использовать * аккумулятор * - и я просто хотел покажите вам, как это сделать с помощью только функции-аргумента. – Carsten
Это просто задача программирования. Есть подсказка, в которой говорится: вы можете использовать простой накопитель, а не монаду. –