Abh*_*kar 1 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
Run Code Online (Sandbox Code Playgroud)
这unsafePerformIO可以以某种方式避免吗?我知道Process monad本身只是IO monad的包装器,但是在我的变换器堆栈中有一些必不可少的IO操作,这是无法避免的.
是的,当然.Process是一个实例MonadIO,所以你可以
let run = liftIO . runApp
Run Code Online (Sandbox Code Playgroud)
代替.