2

モナド操作に慣れ始めたばかりです。Option タイプについては、Tony Morris のチート シートが役立ちました: http://blog.tmorris.net/posts/scalaoption-cheat-sheet/

したがって、最終的には次のことを理解するのは簡単に思えます。

  • map はオプション内の値を変換します
  • 変身する許可を平らにOption[Option[X]]するOption[X]
  • Option[Option[X]]flatMap はどういうわけか、 を生成してからフラット化するマップ操作ですOption[X]

少なくともそれは今まで私が理解していることです。


Each の場合、Either 自体は正しくバイアスされておらず、map / flatMap 操作がなく、射影を使用しているため、理解するのが少し難しいようです。

Scaladoc は読めますが、オプションのチート シートほど明確ではありません。誰かが基本的なモナド操作を説明するために、どちらかのシートチートを提供できますか?

それは私にEither.joinRightは少し似RightProjection.flatMapているようで、どちらかの場合と同等のようOption.flattenです。

Right がバイアスされている場合Either、Either.flatten は、Either.joinRight ではないでしょうか?

この質問では、オプションと理解のためにEiherとの理解を求めていますが、答えの1つは、マップ/フラットマップ/フィルターに脱糖する方法のためにモナドを混在させることはできないと言っています。

この種のコードを使用する場合:

def updateUserStats(user: User): Either[Error,User] = for {
  stampleCount <- stampleRepository.getStampleCount(user).right
  userUpdated <- Right(copyUserWithStats(user,stampleCount)).right
  userSaved <- userService.update(userUpdated).right
} yield userSaved

これは、3 つのメソッド呼び出しすべてが常に返さなければならないということEither[Error,Something]ですか? メソッド呼び出しEither[Throwable,Something]があるとうまくいかないということですか?


編集: Try[Something] は、右バイアスの [Throwable,Something] とまったく同じですか?

4

1 に答える 1

3

Either例外処理ベースの構造を意図したものではありませんでした。関数が実際に 2 つの異なる型のいずれかを返す可能性がある状況を表すことを意図していましたが、人々は左の型が失敗の場合であり、右の型が成功の場合であるという規則を開始しました。成功/失敗タイプのビジネス チェック ロジックに対してバイアスされたタイプを返したい場合は、Validationfromが適切にscalaz機能します。値または を返す関数がある場合はThrowableTry適切な選択です。 Either可能性のある 2 つのタイプのいずれかが実際に発生する可能性がある状況で使用する必要があります。現在TryValidation(それぞれ異なるタイプの状況で) と を使用しているので、もう使用することはありませんEither

于 2013-04-25T00:59:35.193 に答える