我在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'。這是不安全的。 –