【发布时间】: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