在哈斯克尔与单体变压器RWST合作



我在Haskell项目中使用单体变压器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

但是这段代码不起作用!我该如何实现?

首先,我认为你的HSL类型可能会更好。HSL是monad,但你限制了它。状态类型和 monad "值"类型可能不同。您可以随时限制它们。

type HSL l a = RWST HBConfig [HBLog] l IO a

或更好:

type HSL l = RWST HBConfig [HBLog] l IO

其次,您的HSLmonad 只能具有转换HSL l a -> l,并且具有配置和初始状态的默认值。如果你想隐藏这个参数,你应该考虑在哪里可以得到它们?例如,您可以从 IO 获取它:

ujs :: HSL l a -> IO l
ujs act = do
config <- ...
initState <- ...
fst <$> execRWST act config initState

最新更新