Эквивалентный абстрактный псевдо-i sh код в Haskell будет выглядеть так:
loop = do
line <- readFromConsole
if condition line
then do
printStuffToConsole
loop -- Recurse - i.e. repeat the same thing again
else
pure () -- Don't recurse - the function execution ends
main = loop
Но, конечно, дьявол будет выглядеть так, как выглядят readFromConsole
и printStuffToConsole
. И это действительно зависит от того, что именно вы хотели бы сделать.
Я предложу самую глупую из возможных реализаций, просто чтобы проиллюстрировать, как все работает, и построить полную программу.
Допустим, что «читать из консоли» означает, что пользователь вводит строку текста и нажимает Enter. Для этого вы можете использовать функцию getLine
:
readFromConsole = getLine
И, скажем, вы хотите печатать одно и то же каждый раз. Для печати вы можете использовать функцию putStrLn
:
printStuffToConsole = putStrLn "Give me another!"
И затем предположим, что условие остановки состоит в том, что пользователь вводит «STOP». Это можно выразить сравнением строк:
condition line = line /= "STOP"
Если сложить все это вместе, вы получите полную программу:
loop = do
line <- readFromConsole
if condition line
then do
printStuffToConsole
loop -- Recurse - i.e. repeat the same thing again
else
pure () -- Don't recurse - the function execution ends
where
readFromConsole = getLine
printStuffToConsole = putStrLn "Give me another!"
condition line = line /= "STOP"
main = loop
Конечно, хотя приятно иметь детали программы с семантическим названием, строго говоря, вам не нужно делать это, если вы хотите сделать все это короче:
main = do
line <- getLine
if line /= "STOP"
then do
putStrLn "Give me another!"
main
else
pure ()