Haskell - как создать цикл, в котором есть getLine?

Я хочу создать цикл, который будет принимать пользовательский ввод, то есть getLine, во время каждой итерации цикла. Возможно ли это внутри main или с помощью функции getLine в передаче параметров или нет вообще? Я относительно новичок в Haskell, и почти все у меня в голове, но в этом я не уверен. Очевидно, что для выхода из него будет использоваться сопоставление с образцом, но как мне получить ввод пользователя? Я пытался понять это сам, но каждый раз терпел неудачу. Заранее спасибо.


person Faffy    schedule 19.04.2019    source источник


Ответы (1)


Вы должны использовать монаду ввода-вывода для своих функций, для создания цикла вы можете просто сделать рекурсивный вызов, проверьте этот пример:

-- This just wraps the getLine funtion but you could operate over the input before return the final result
processInput :: IO String
processInput = do
    line <- getLine
    return $ map toUpper line


-- This is our main loop, it handles when to exit
loop :: IO ()
loop = do
    line <- processInput
    putStrLn line
    case line of
        "quit"    -> return ()
        otherwise -> loop

-- main is the program entry point
main :: IO ()
main = do
    putStrLn "Welcome to the haskel input example"
    loop

Здесь у вас есть живой пример

person Netwave    schedule 19.04.2019
comment
@RobinZigmond, я упомянул об этом в комментарии, я просто хотел указать, что, если ему нужно преобразовать входную строку, это можно сделать там. Просто чтобы показать OP пример с 3 основными моментами. 1 - функция, выполняющая некоторые операции, 2 - основной цикл и 3 - точка входа. - person Netwave; 19.04.2019
comment
Извините @NetWave, я заметил, что после публикации, поэтому удалил мой текущий. Но я все еще думаю, что это сбивает с толку новичка - вы говорите, что это обертывание getLine, без определения того, что вы подразумеваете под оберткой, хотя на самом деле это точно то же самое. - person Robin Zigmond; 19.04.2019