Haskell结束循环返回

时间:2013-03-26 14:43:58

标签: haskell

我试图阻止我的程序在函数循环结束后停止。让我先介绍一下背景 - 在最近Haskell尝试失败后(Here),我已经完成了一些教程,并且能够成功创建包含名称和优先级的自己的列表(下面,工作代码 - 如果复制/粘贴错过了它,则道歉)。

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

如您所见,输入列表项,然后在输入“退出”时,代码打印列表内容。

我遇到的问题是,在输入'退出'并打印列表项时,当我重新进入程序时,项目已经消失。

我想要实现的是运行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',但收效甚微。我怎样才能将这个实现到我的设计中?

1 个答案:

答案 0 :(得分: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

您可能会注意到,我推测您的函数gatherInfo会在用户输入“退出”时返回名称为“退出”的患者,但您可以通过其他方式执行此操作