有没有办法在运行时启动两个提示解释器并随后将较小的计算分配给一个或另一个?当我为一个小表达式调用提示(例如,输入到网站中)时, - 没有可靠的测试 - 在我看来,启动/加载提示的时间大约是一秒。如果实例已经启动,那么第二个将被剃掉。
该提示似乎没有我可以启动它的功能,并保持它很好地等待以后使用。
(自动)插件当然是另一个选择,但我认为这更适合模块,而对于较小的计算则不太优雅。
有没有办法在运行时启动两个提示解释器并随后将较小的计算分配给一个或另一个?当我为一个小表达式调用提示(例如,输入到网站中)时, - 没有可靠的测试 - 在我看来,启动/加载提示的时间大约是一秒。如果实例已经启动,那么第二个将被剃掉。
该提示似乎没有我可以启动它的功能,并保持它很好地等待以后使用。
(自动)插件当然是另一个选择,但我认为这更适合模块,而对于较小的计算则不太优雅。
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
(我没有对此进行测试,所以我可能遗漏了一两个细节,但基本的想法是可行的。)