私はプレイを持っています! 2外部サービスからJSON形式のデータを取得する必要があるScalaアプリケーションの場合モナド変圧器はサービスからJSONを取得するために適用されますか?
The Play!フレームワークはPromiseで応答をラップすることによって非同期的にHTTP要求を行うことを可能にします。 Promise
は将来利用できる値をラップするモナドです。
これは問題ありませんが、私の場合、Webサービスから得られるものはJSON文字列です。私はそれを解析する必要があり、解析が失敗する可能性があります。だから私はOption
に入るものをすべてラップする必要があります。その結果、私のメソッドの多くはPromise[Option[Whatever]]
を返しています。つまり、タイプWhatever
の値は、おそらく後で利用可能になります。
私はそのような値を超えて操作しなければならないときはいつでも、それはmap
に2回必要です。 map
のような関連するメソッドを定義Promise[Option[A]]
Hope[A]
を言う、新しいタイプを作成
- (または多分私は
foreach
を使用して、いくつかのコレクションから継承する必要があります:私は、次の方法でこれを扱うことを考えていました。形質)?flatten
Promise[Option[A]]
とHope[A]
の間の暗黙的な変換を提供します。
はmap
を定義することは容易である - 二つのファンクタの組成物は、再びファンクタであり - そしてflatten
は、この場合には、明示的に行うことができ、又はOption
とのモナドを構成するたびに。
しかし、私はこのことを再考する必要はないと私の限られた理解です:この場合、モナドトランスがあります。モナド変圧器を一度も使用していないと思います。これは質問のポイントです。
この状況でモナドトランスフォーマーを使用できますか?実際にそれらを使ってどうやって行くのですか?
ありがとう、これは私が必要とするものです! – Andrea
私はそれを試して、すべて私のアプリケーションで正常に動作します。私の関数の戻り値の型を簡素化するために型の別名 'type Hope [A] = Promise [Option [A]]を導入すると、コンパイル時エラー' java.lang.IllegalArgumentException :転置するには、すべてのコレクションのサイズが同じであることが必要です。なぜあなたは何か手がかりがありますか? – Andrea
@アンドレア:明示的な型パラメータを 'optionT'で使用すると、エラーはなくなります。コンパイラのバグのように見えますが、時間がある場合は、[Issue Tracker](https://issues.scala-lang.org/secure/Dashboard.jspa)をチェックするか、ここでフォローアップの質問をする価値があります。 –