#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
, не уточняя, что вы подразумеваете под «обертыванием», когда на самом деле это одно и то же.