2015-06-27 2 views
0

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

Позволяет сказать:

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

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

Благодаря

ответ

3

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

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 

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

+0

Спасибо за вашу помощь, но это не то, что я хочу. Если я не буду вводить имя и только возраст, то не должно быть выхода. Затем, когда я ввожу имя и возраст в следующий раз, результатом должно быть введенное имя и возраст, который был введен ранее. –

+1

well tbh: Я не знаю точно, что вы пытаетесь сделать (на ваш вопрос указано иначе) - но фрагмент должен быть легко адаптирован - вы только просили использовать * аккумулятор * - и я просто хотел покажите вам, как это сделать с помощью только функции-аргумента. – Carsten

+0

Это просто задача программирования. Есть подсказка, в которой говорится: вы можете использовать простой накопитель, а не монаду. –