2016-12-26 8 views
1

私は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 

しかし、このコードは動作しません!これをどのように実装できますか?

+0

最後の 'ujs'では、RWSTアクションに「設定」と初期状態を指定せずに実行しようとしています。あなたは 'ask'と' get'をしようとしています - つまり、RWSTブロックを生成していますが、同じアクションでRWSTブロックを実行する*ことを意味します。 – Michael

+1

'unsafePerformIO'は使わないでください。それは危険です。 –

答えて

2

まず、あなたのHSLタイプがより良いかもしれないと思います。 HSLはモナドですが、あなたはそれを制限しました。状態タイプとモナド「値」タイプは異なる場合があります。いつでも、あなたはそれらを制限することができます。

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

以上:第二に

type HSL l = RWST HBConfig [HBLog] l IO 

、あなたのHSLモナドだけで設定し、初期状態のデフォルト値に変換HSL l a -> lを持つことができます。このパラメータを非表示にしたい場合は、そのパラメータを取得できる場所について考える必要があります。たとえば、IOから取得することができます:

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

答えてくれてありがとうございますが、これが私の主な問題です:どこで設定と状態を取得できますか?いくつかのアイデアがありました。仕事は続けられます。 – QSpider

+0

明示的に追加しないのはなぜですか? – freestyle

+0

あなたのアイデアをありがとう。私は関数 'ujs :: HSL HLangJS HLangJS - > HBConfig - > HLangJS - > HLangJS'を実装しました。私はアプリケーションのアーキテクチャを見直しました。これで、設定とステータスが関数に渡されました。 – QSpider

関連する問題