有没有办法启动两个提示解释器,并在运行时&随后将较小的计算分配给其中一个或另一个?当我调用一个小表达式的提示(例如输入一个网站)然后, - 没有可靠的测试 - ,在我看来,似乎启动/加载提示的时间大约是一秒钟。如果实例已经启动,则第二个将被削减。
该提示似乎没有任何功能,我可以启动它并保持良好状态等待以后使用。
(自动)插件当然是另一种选择,但我认为它更适合模块而不适合较小的计算。
答案 0 :(得分:2)
GHC api,暗示是以(各种插件包也是)实现的,不支持并发使用。
但是你可以让提示继续运行。这是MonadIO
的实例。
interpreterLoop :: (MonadIO m, Typeable) a => Chan ((MVar a, String)) -> InterpreterT m ()
interpreterLoop ch = do
(mvar, command) <- liftIO $ readChan ch
a <- interpret command $ argTypeWitness mvar
liftIO $ putMVar mvar a
interpreterLoop ch
where
argTypeWitness :: MVar a -> a
argTypeWitness = undefined -- this value is only used for type checking, never evaluated
runInLoop :: Typeable a => Chan ((MVar a, String)) -> String -> IO a
runInLoop ch command = do
mvar <- newEmptyMVar
writeChan ch (mvar, command)
takeMVar mvar
(我没有对此进行测试,所以我可能错过了一两个细节,但基本想法会起作用。)