编辑2015-11-29:见底部
我正在尝试编写一个具有do-last-action-again按钮的应用程序.有问题的命令可以请求输入,我对如何实现这一点的想法就是用memoized IO重新运行生成的monad.
SO上有很多关于类似问题的帖子,但这些解决方案似乎都没有.
我memoIO从这个SO答案中解除了代码,并将实现改为运行MonadIO.
-- Memoize an IO function
memoIO :: MonadIO m => m a -> m (m a)
memoIO action = do
ref <- liftIO $ newMVar Nothing
return $ do
x <- maybe action return =<< liftIO (takeMVar ref)
liftIO . putMVar ref $ Just x
return x
Run Code Online (Sandbox Code Playgroud)
我有一个小应用程序的方法,唯一真正的区别是我的应用程序有一个大的变压器堆栈而不是只是运行IO:
-- Global variable to contain the action we want to repeat
actionToRepeat :: IORef (IO String) …Run Code Online (Sandbox Code Playgroud)