我有一个需要一些时间来处理某些输入的功能。
我想这样做,以便如果用户调用该函数将开始执行其功能,但是如果用户再次调用它并且仍在处理该事情,它将返回一条消息,告诉用户请坐紧。
runService :: Arg1 -> Arg2 -> IO String
runService arg1 arg2 = do
isRunning <- {- Check if the function is running -}
isDone <- {- Check if the function is done working -}
if isRunning
then return "Work is in progress!"
else if isDone
then return "Work is done."
else do startService arg1 arg2
return "Work has been started."
我相信我也需要修改startService
函数,但不确定如何。
这是它的当前类型签名。
startService :: Arg1 -> Arg2 -> IO ()
如果runService
可以提供某种“进度条”,那将是[[甚至更有用。
runService :: Arg1 -> Arg2 -> IO String
runService arg1 arg2 = do
isRunning <- {- Check if the function is running -}
isDone <- {- Check if the function is done working -}
if isRunning
then {- Return some progress indicator -}
else if isDone
then return "Work is done."
else do startService arg1 arg2
return "Work has been started."
{- Return some progress indicator -}
startService
使用putStrLn
打印其状态非常简单,但是我不确定如何将这些状态字符串提供给runService
或如何将该状态字符串一直向上传递到[ C0]。对于过程语言,这将要求使用全局变量。在Haskell中寻找相似的东西导致我进入
main
monad变形金刚,但是我很难理解它们以及它们在一般情况下的用法。
所以您想从功能上看它:
StateT, ReaderT, WriterT
。观察进度是另一个涉及计算功能合作的问题。如果可以分步进行工作,则可能应该使用
continuation pass style,以便使函数保持纯净。此函数将执行一个计算步骤,然后返回一对(估计进度比率,下一步)。
另一个函数,即IO中的这个函数,将继续调用计算函数并以进度比更新共享状态,直到完成工作。在共享框中,使用代数数据类型:
您在这里。