私は遊びを持っています!2外部サービスからJSON形式のデータを取得する必要があるScalaアプリケーションの場合。
遊び!フレームワークでは、応答をPromiseでラップすることにより、HTTPリクエストを非同期で作成できます。Promise
は、将来利用可能になる値をラップするモナドです。
これは問題ありませんが、私の場合、Webサービスから取得するのはJSON文字列です。解析する必要があり、解析が失敗する可能性があります。だから私は私が入るものは何でもラップする必要がありOption
ます。その結果、私のメソッドの多くがを返していPromise[Option[Whatever]]
ます。つまり、Whatever
後で利用可能になる可能性のあるタイプの値です。
今、私がそのような値を操作しなければならないときはいつでも、私はmap
それを2回行う必要があります。私はこれを次のように扱うことを考えていました:
Hope[A]
たとえば、をラップする新しいタイプを作成しますPromise[Option[A]]
- 次のような関連するメソッドを定義します
map
(またはforeach
、コレクションの特性を使用して継承する必要がありますか?)flatten
Promise[Option[A]]
との間の暗黙的なコンバータを提供しHope[A]
ます。
定義するのは簡単ですmap
-2つのファンクターの合成もファンクターです-flatten
この場合、またはでモナドを構成するときはいつでも明示的に行うことができますOption
。
しかし、私がこのようなものを再発明する必要がないことは私の限られた理解です。モナド変換子はまさにこの場合に存在します。または、まあ、私は思う-私はモナド変換器を使用したことがない-そしてこれが質問のポイントです:
この状況でモナドトランスフォーマーを使用できますか?実際にどのように使用しますか?