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

#haskell #function-call

#haskell #вызов функции

Вопрос:

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

Ответ №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
 

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

Комментарии:

1. @RobinZigmond, я упомянул об этом в комментарии, я просто хотел указать, что если ему нужно преобразовать входную строку, это можно сделать там. Просто чтобы показать OP пример с 3 основными точками. 1, функция, которая выполняет некоторую операцию, 2, основной цикл и 3, точка входа.

2. Извините @NetWave, я заметил это после публикации, поэтому удалил свой текущий. Но я все еще думаю, что это сбивает с толку новичка — вы говорите, что это «обертывает» getLine , не уточняя, что вы подразумеваете под «обертыванием», когда на самом деле это одно и то же.