2017-04-05 9 views
0

私は、以下の目標を達成するのに苦労しています。希望の値を返すように、またはステータスコードが成功を示していないときにエラーを返すように、認証トークンが無効です。Either String rハロゲンコンポーネントクエリのthrowError

今、私はコンポーネントのクエリをevalにすると気にしたくありません。私は幸せなパス(無効なログオン試行のような予想されるエラーは幸せなパスとみなされ、予期せぬものを残したいだけです)にエラーがあります。エラーは均一かつグローバルに処理する必要があります。このため

、私が作成したトランス・スタック:

type App = ReaderT Env (ExceptT String (Aff AppEffects)) 

さて、runUIでそれを使用するために、私は(私は他の可能性を欠けている場合を除き)hoistで使用される自然な変換を提供するために必要:

runApp :: Env -> App ~> Aff AppEffects 
runApp env app = do 
    res <- runExceptT $ runReaderT app env 
    case res of 
    Right r -> pure unit 
    Left err -> do Bus.write err env.bus 
        -- what to return here? 

私たちはここに~>を使用しているので、我々は、戻り値の型を保持するように強制しているが、Leftケースのために私は手でそれを持っていません!

どのようにそのような要件に取り組んでいますか?繰り返す - 私は、実行されたアクションがエラーに遭遇したときにコンポーネントクエリの評価を 'キャンセル'できるようにしたいが、それを静かに行い、上から処理したい。

答えて

1

現在のスレッドを続行できない例外があります。を使用してAffに例外をスローするしかありません。

0

私が達成したいことは、実際には望ましくないと結論づけました。エラーが起きたという事実に気付かないコンポーネントクエリの評価を行うことは何の役にも立たない(そのコンポーネントがエラーを完全に処理することには関心がないかもしれないが、

したがって、私が本当に必要とするのは、エラーを処理して、それが起こったという事実の簡単な指示を返すようなヘルパーです。