避免`unsafePerformIO`在进程Monad

时间:2018-02-05 19:08:14

标签: haskell cloud-haskell

我正在使用Cloud Haskell进行消息处理。我也使用一般的monad变换器堆栈(底部有IO)来进行状态,配置等的一般跟踪。

我遇到了必须使用unsafePerformIO在Process monad中工作的情况。我在描述下面的情况。请记住,这是一个非常人为的例子来简化和呈现问题的症结

data AppConfig
data AppState 

type App = ReaderT AppConfig (StateT AppState IO)

runApp :: App a -> Int -> IO (a, AppState)
runApp k maxDepth =
    let config = AppConfig maxDepth
        state = AppState 0
    in runStateT (runReaderT k config) state

msgHandler :: App ()
msgHandler = -- some message handling logic here --

runServer :: Process ()
runServer = do
  let run handler = return $ unsafePerformIO $ runApp handler
  (_,_) <- receiveWait [match $ run taskSubmissionHandler]
  runServer

可以以某种方式避免这种unsafePerformIO吗?我知道Process monad本身只是IO monad的包装器,但是在我的变换器堆栈中有一些必不可少的IO操作,这是无法避免的。

1 个答案:

答案 0 :(得分:6)

是的,当然。 ProcessMonadIO的一个实例,因此您可以

let run = liftIO . runApp

代替。