Использование аккумулятора в основном
Я хочу использовать аккумулятор в основном.
Скажем так:
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
это остановит цикл, как только пользователь не даст свое имя