【问题标题】:Haskell Ending Loop ReturnHaskell 结束循环返回
【发布时间】:2013-03-26 14:43:58
【问题描述】:

我试图阻止我的程序在函数中的循环结束后停止。让我先介绍一些背景 - 最近在 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 函数来打印“信息”,但收效甚微。我如何在我的设计中实现这一点?

【问题讨论】:

  • 不能直接在main的最后一行调用main让程序再次运行吗?
  • 您希望数据在程序调用之间保持不变吗?
  • @pat 这是否意味着,数据在重新启动程序之间保留?
  • 是的,听起来您确实想退出程序,然后,当您重新启动它时,您希望所有数据仍然存在。这真的是您想要的吗,还是您只是想在退出时回到问答循环中添加更多患者?
  • 当我退出时(列表打印后),我需要返回问答循环以添加更多患者

标签: haskell


【解决方案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 = main' []   -- start with empty list of patients

您可能会注意到,当用户输入“quit”时,我假设您的函数gatherInfo 将返回名称为“quit”的患者,但是您可以通过其他方式做到这一点

【讨论】:

  • 你不能用(:)patient添加到列表的末尾
  • 这个修改似乎给了我一个'输入'putStrLn'错误的解析错误。我会尝试进行更多调查。
  • @ZeeeeeV 你修改了gatherInfo函数以返回(String, Int)而不是[(String, Int)]?
  • @Martinsos 我有,我也尝试过多种格式化方式,以防这是问题所在。
  • @ZeeeeeV 我相信我知道问题出在哪里,我在“else”之后添加了“do”,我相信它现在应该可以工作了
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 2017-09-30
  • 2015-08-08
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多