對於問題的第一部分,當前案例編號是您在程序執行過程中想要維護的某個「狀態」的示例。在其他語言中,毫無疑問,您會使用可變變量。
在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
編輯:我猜你想要一個更直接的答案,而不是一個提示,讓你的方式將上述方法適應閱讀塊的列表會寫類似:
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 ð看起來像這樣:
main = do
blocks <- readBlocks
putStr $ unlines $
zipWith (\n line -> "Case " ++ show n ++ ": " ++ line)
[1..] (map (show . solve . blockPair) blocks)
「另外,如果可能,你能否建議我在最後打印輸出行的方法? - 我不知道你還想打印什麼,在哪一點上它應該發生.. – duplode
@duplode,它應該像 - 開始時的所有輸入一樣運行,然後在用戶輸入0之後,它應該打印輸出。 – user7201762
我需要一些幫助 – user7201762