1. ホーム
  2. json

[解決済み] イエソドにおける例外

2023-03-02 12:42:16

質問

私は、非常に原始的な形式の ipc (telnet で特定の単語を特定の順序で並べた文字列を送信する) という非常に原始的な形式を使用するデーモンを作っていました。私はそこから抜け出し、現在は JSON にメッセージを渡すために Yesod サーバーにメッセージを渡すためのものです。しかし、私のデザインにはとても気に入っている点がいくつかあり、今となっては何を選択すればよいのかわかりません。

私がやっていたことは以下のとおりです。

buildManager :: Phase -> IO ()
buildManager phase = do
  let buildSeq = findSeq phase
      jid = JobID $ pack "8"
      config = MkConfig $ Just jid
  flip C.catch exceptionHandler $ 
  runReaderT (sequence_ $ buildSeq <*> stages) config
  -- ^^ I would really like to keep the above line of code, or something like it.
  return ()

buildSeqの各関数は以下のような感じです。

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMapTMVar Map であり、現在の仕事に関する情報を追跡するものです。

現在、私が持っているのはハンドラで、すべて次のようなものです。

foo :: Handler RepJson

foo は私のデーモンに対するコマンドを表し、各ハンドラは異なるJSONオブジェクトを処理する必要があるかもしれません。

私がやりたいことは、1つの JSON オブジェクトを送信し、もう一つのJSONオブジェクトは例外についての情報を表します。

私が欲しいのは foo のヘルパー関数で Either を返せるようにする必要がありますが、 どうすればそれを得られるのか、さらにアクションのリストの評価を 終了させることができるのか、よくわかりません。 buildSeq .

これが私が見た唯一の選択肢です。

1) 確認してください exceptionHandler がハンドラ内にあることを確認する。置く JobMap の中に App のレコードを作成します。を使って getYesod で適切な値を変更します。 JobMap にある、例外についての詳細を示す値を変更します。 でアクセスすることができます。 foo

もっと良い方法はないでしょうか?

他の選択肢は?

編集:わかりやすくするために、以下の役割を説明します。 Handler RepJson . サーバは以下のようなコマンドを受け取る方法が必要です。 build stop report . クライアントは、これらのコマンドの結果を知るための何らかの方法が必要です。私は、サーバーとクライアントが互いに通信する媒体としてJSONを選びました。HandlerタイプはJSONの入出力を管理するためだけに使用しており、それ以上のことはしていません。

どのように解決するのですか?

哲学的に言えば、Haskell/Yesodの世界では、値を後ろから返すのではなく、前方に渡したいのです。したがって、ハンドラに値を返させる代わりに、例外を生成するようなプロセスの次のステップへ前方に呼び出すようにします。

ハンドラやfoosに継続オブジェクトを渡して、基本的に「終わったら、このコードの塊を実行してください」と伝えることができます。