関数のループが終了した後、プログラムが停止しないようにしようとしています。最初にいくつかの背景を説明しましょう-Haskellでの最近の試みが失敗した後(ここ)、私はいくつかのチュートリアルを実行し、名前と優先度の両方を含むリストを正常に作成することができました(以下、動作中のコード-お詫びしますコピー/貼り付けでインデントが間違っています)。
module Main where
-- Function Main, gather details, then print
main :: IO ()
main = do info <- gatherInfo
let names = info
putStrLn . unlines . map printDetails $ names
-- Function to Get the Info
gatherInfo :: IO [(String, Int)]
gatherInfo = do putStr "Name: "
name <- getLine
if name == "quit"
then return []
else do priority <- getPri
let info = (name,priority)
otherInfo <- gatherInfo
return $ info : otherInfo
-- Function to get Priority
getPri :: IO Int
getPri = do putStr "Priority: "
input <- getLine
let parsed = reads input
if parsed == []
then do putStrLn "Incorrect Entry, please enter again"
getPri
else return $ fst $ parsed !! 0
--Function to print each detail
printDetails :: (String, Int) -> String
printDetails (name, priorityScore) = "Name: " ++ name ++ "Priority: " ++ show priorityScore
このコードは、次の出力(ユーザー入力を含む)を出力します。
Patient Name: test1
Patient Priority: 1
Patient Name: test2
Patient Priority: 2
Patient Name: quit
Patient name: test1 Priority: 1
Patient name: test2 Priority: 2
ご覧のとおり、リストアイテムが入力され、「quit」と入力すると、コードによってリストの内容が出力されます。
私が抱えている問題は、「quit」と入力してリストアイテムを印刷すると、プログラムに戻ったときにアイテムがなくなってしまうことです。
私が達成しようとしているのは、gatherInfo関数を実行し、リストを(全体として)印刷してから、gatherInfo関数に戻って別の項目を追加することです。たとえば、私の出力は次のようになります。
Patient Name: test1
Patient Priority: 1
Patient name: test1 Priority: 1
Patient Name: test2
Patient Priority: 2
Patient name: test1 Priority: 1
Patient name: test2 Priority: 2
Patient Name: quit (Quit program, doesn't matter what happens now)
私はこれを実装するためにいくつかの試みをしました。たとえば、各gatherInfoループ中にprintDetails関数を呼び出して「info」を出力しますが、ほとんど成功しません。これを自分のデザインに実装するにはどうすればよいですか?