小编San*_*ire的帖子

记忆和重复IO monad

编辑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)

io haskell memoization

5
推荐指数
2
解决办法
277
查看次数

标签 统计

haskell ×1

io ×1

memoization ×1