Для первой части вашего вопроса текущий номер случая является примером некоторого «состояния», которое вы хотите сохранить в ходе выполнения вашей программы. На других языках вы, несомненно, будете использовать изменяемую переменную.
В Haskell существует несколько способов борьбы с состоянием. Один из самых простых (хотя иногда немного некрасиво), чтобы передать состояние явно в качестве параметра функции, и это будет работать очень хорошо, учитывая то, как вы уже структурированный код:
main = loop 1
loop n = do
...
putStr ("Case " ++ show n ++ ": Output = ...")
...
loop (n+1) -- update "state" for next loop
во втором часть вашего вопроса немного более сложна. Похоже, вы хотели намек вместо решения. Чтобы вы начали, позвольте мне показать вам пример функции, которая читает строки до тех пор, пока пользователь не войдет в end
, а затем вернет список всех строк до, но не включая end
(вместе с функцией main
, которая делает что-то интересное с линиями используя в основном чистый код):
readToEnd :: IO [String]
readToEnd = do
line <- getLine
if line == "end"
then return []
else do
rest <- readToEnd
return (line:rest)
main = do
lines <- readToEnd
-- now "pure" code makes complex manipulations easy:
putStr $ unlines $
zipWith (\n line -> "Case " ++ show n ++ ": " ++ line)
[1..] lines
Edit: Я думаю, что вы хотели больше прямого ответа, а не намек, так как вы бы адаптировать выше подход к чтению списка блоков было бы написать что-то вроде:
readBlocks :: IO [[Int]]
readBlocks = do
n <- read <$> getLine
if n == 0 then return [] else do
arr <- replicateM n getLine
let block = map read $ words $ unwords arr
blocks <- readBlocks
return (block:blocks)
, а затем main
woul d выглядеть следующим образом:
main = do
blocks <- readBlocks
putStr $ unlines $
zipWith (\n line -> "Case " ++ show n ++ ": " ++ line)
[1..] (map (show . solve . blockPair) blocks)
«Также, если возможно, вы можете предложить мне способ печати выходной линии в самом конце?» - Я не уверен, что еще вы хотели бы напечатать, и в какой момент это должно произойти. – duplode
@duplode, он должен работать как - все входы в начале, а затем после того, как пользователь вводит 0, он должен распечатать выходы. – user7201762
Мне нужна помощь, пожалуйста, – user7201762