我在Haskell项目中使用monad变压器RWST。下面是我的源代码:在Haskell中使用monad变压器RWST
type HSL a = RWST HBConfig [HBLog] a IO a
runScript :: (HLanguage a, BuilderHSL a)
=> HBConfig
-> HSL a
-> String
runScript hbConf srcHSL =
unsafePerformIO $ do
(_, s, log) <- runRWST srcHSL hbConf initHLang
return $ buildHSL hbConf s
我实现的功能HSL HLangJS -> HLangJS
如下图所示:
ujs :: HSL HLangJS -> HLangJS
ujs srcHSL =
unsafePerformIO $ do
(a, s, log) <- runRWST srcHSL defaultHBConfig HLangJS
return a
一切工作。但!!!我相信这不是最好的解决方案! 的配置和日志必须从变压器被要求在此代码所示:
ujs :: HSL a -> a
ujs rws =
unsafePerformIO $ liftIO $ do
c <- ask
s <- get
(a, _, _) <- runRWST rws c s
return a
但是这个代码不工作!我怎样才能实现这个?
在过去'ujs'你想运行一个RWST动作,而与“配置”和初始状态提供它。您正在尝试执行'ask'和'get' - 这意味着您正在生成一个RWST块 - 但是然后在同一个动作中运行一个RWST块。 – Michael
请勿使用'unsafePerformIO'。这是不安全的。 –