1

関数のループが終了した後、プログラムが停止しないようにしようとしています。最初にいくつかの背景を説明しましょう-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」を出力しますが、ほとんど成功しません。これを自分のデザインに実装するにはどうすればよいですか?

4

1 に答える 1

1

これを行うことをお勧めします
。1人の患者の情報のみを取得するように情報収集機能を変更します。
次に、別の関数を作成し、それをmainと呼びましょう':

main' patients = do patient <- gatherInfo
                    if (fst patient == "quit") 
                       then return ()
                       else do 
                               let patients' = patient:patients   -- add patient to list of patients
                               putStrLn . unlines . map printDetails $ patients' -- print list of patients
                               main' patients'  -- continue

ここで行っているのは、パラメーターを渡すことによってプログラムの状態を記憶することです(これは、状態がないため、Haskellで行われる方法です)。これで、メイン関数は次のようになります。

main = main' []   -- start with empty list of patients

ユーザーが「quit」と入力すると、関数gatherInfoが「quit」という名前の患者を返すと推測したことに気付くかもしれませんが、他の方法でそれを行うことができます。

于 2013-03-26T14:56:50.637 に答える