私はHaskellプロジェクトでモナドトランスRWSTを使用しています。以下は、私のソースコードは次のとおりです。以下に示すようにハスケルでのモナドトランス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'は使わないでください。それは危険です。 –