我正在使用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操作,这是无法避免的。
答案 0 :(得分:6)
是的,当然。 Process
是MonadIO
的一个实例,因此您可以
let run = liftIO . runApp
代替。