Использование аккумулятора в основном

Я хочу использовать аккумулятор в основном.

Скажем так:

main = do
   putStrLn "Hey there, what's your name and age?"
   name <- getLine
   age <- getLine
   putStrLn ("Hi " ++ name ++ " you are " ++ age ++ " years old!")
   main

Так что я хочу сделать, если пользователь не указал свое имя и только возраст, я хочу использовать возраст, который был введен ранее в следующем основном вызове. Любое предложение, как я могу этого достичь?

Спасибо

1 ответ

Просто используйте другую функцию, где вы можете использовать аргументы по вашему выбору:

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 ""

Позвольте мне внести небольшое улучшение: вам, вероятно, не нужен здесь бесконечный цикл - вы можете легко избавиться от него, используя:

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

это остановит цикл, как только пользователь не даст свое имя

Другие вопросы по тегам