Scalaでどちらかのモナドを処理するエレガントな方法はありますか?

LeYAUable

私はScalaを起動し、JSONを処理するためにcirceを使用してプロジェクトを実行しています。

私は関数からのEitherリターンをたくさん目にしますが、それらすべてを処理するためのエレガントな方法を見つけられないようです。

たとえば、どちらか1つについては、次のスニペットのようにします。

if (responseJson.isRight) {
//do something
} else {
//do something else
}

しかし、それらがたくさんある場合はどうすればよいですか。たとえば、この例では、右側にまっすぐ進み、追加の検証を行う必要があると感じています。

ClassA(
       someValue,
       someValue,
       someJson.hcursor.get[Double]("jsonKey1").right.get,
       someJson.hcursor.get[Double]("jsonKey2").right.get,
       someJson.hcursor.get[Double]("jsonKey3").right.get
      )

複数のEitherオブジェクトがである場合にそれらのコンテンツを取得したいが、Rightそれらが常にであるRightどうかわからない場合、複数のオブジェクトを(if-elsesなどの束で終わることなく)どのように処理する必要がありますか?

sarveshseri

ケースクラスがあるとしましょう。

case class Demo(i: Int, s: String)

そして2つのどちらか、

val intEither: Either[Throwable, Int] = ???
val stringEither: Either[Throwable, Int] = ???

だから...最も基本的で明白なものから始めましょう、

val demoEither: Either[Throwable, Demo] = 
  intEither.flatMap(i => 
    stringEither.map(s => Demo(i, s))
  )

別の方法は、上記と同じことを行うことです-内包表記を使用することです、

val demoEither: Either[Throwable, Demo] = 
  for {
    i <- intEither 
    s <- stringEither
  } yield Demo(i, s)

ただし、monadsシーケンシャルです。つまり、最初の列Eitherがaの場合Left、2番目の列を見ることすらなくEitherLeft。を取得するだけですすべてのコンポーネントの検証情報を失いたくないので、これは検証にはほとんど望ましくありませんApplicativeしたがって、実際に必要なのはです。

そしてEitherないApplicative、あなたが使用する必要がありますcatsか、scalazまたはこのため、独自のApplicativeを実装します。

catsは、Validated検証されたコンポーネントのすべてのエラー情報を検証および保持できるようにする、この明確な目的のためアプリケーションを提供します。

import cats.data._
import cats.implicits._

val intValidated: ValidatedNec[Throwable, Int] = 
  intEither.toValidatedNec

val stringValidated: ValidatedNec[Throwable, String] =
  stringEither.toValidatedNec

val demoValidated: ValidatedNec[Throwable, Demo] = 
  (intValidated, stringValidated).mapN(Demo)

val demoEither: Either[List[Throwable], Demo] = 
  demoValidated.leftMap(errorNec => errorNec.toList)

または、これを1回だけ実行していて、に依存したくないcats場合は、非常に用途の広いパターンマッチングを使用できます。

val demoEither: Either[List[Throwable], Demo] = 
  (intEither, stringEither) match {
    case (Right(i), Right(s)) => Right(Demo(i, s))
    case (Left(ti), Left(ts)) => Left(List(ti, ts))
    case (Left(ti), _) => Left(List(ti))
    case (_, Left(ts)) => Left(List(ts))
  }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaでリストを処理するよりエレガントな方法はありますか?(Python VS Java)

分類Dev

Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

分類Dev

Rのunitsパッケージから対数変換された軸と単位を処理するエレガントな方法はありますか?

分類Dev

どちらかのモナドを返す関数を処理する方法

分類Dev

処理されたデータをカウントするためのエレガントなPythonicの方法はありますか?

分類Dev

Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

分類Dev

配列内のどの要素が別のコンテナにあるかを確認するためのエレガントな方法はありますか?

分類Dev

C(AVRプログラミング)で変数をRAMまたはROMのどちらに格納するかを選択し、すべてのコードで処理する簡単な方法はありますか?

分類Dev

どちらかのようなエラー処理モナドはどのようにして参照透過性を実現しますか?

分類Dev

Hateoasはフロントエンドからどのように処理する必要がありますか?

分類Dev

rebol / red:それがforeachの最後のアイテムであるかどうかを知るためのエレガントな方法はありますか?

分類Dev

このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

分類Dev

同じクラスの同じ名前の関数-どちらを呼び出すかを決定するためのエレガントな方法はありますか?

分類Dev

あるモナドが別のモナドを呼び出すのを処理するクリーンな方法は何ですか?

分類Dev

Pythonで相対パスを取得するためのエレガントな方法はありますか?

分類Dev

印刷されたステートメントを、それを印刷したコード行までたどるエレガントな方法はありますか?

分類Dev

PostgreSQLの例外を処理するエレガントな方法は?

分類Dev

どちらかのモナドのコンテキストでData.Map.lookupを使用する方法は?

分類Dev

switch-caseの関数からデータを変更するより効率的でエレガントな方法はありますか?

分類Dev

PHPには、深くネストされたオプションのノードを使用してJSONを処理するエレガントな方法がありますか?

分類Dev

関係を定義するエレガントな方法はありますか?

分類Dev

Javaで複数のメソッドの戻り値の最初の非null値を取得するエレガントな方法はありますか?

分類Dev

どちらかのモナド:すべての正しい値を収集し、最後にそれらすべてを処理する方法は?

分類Dev

これらの条件を書くためのよりエレガントな方法はありますか?

分類Dev

タグレスファイナルでどちらかをエラーに変更するエレガントな方法

分類Dev

この「if」リストをよりエレガントな方法で書く方法はありますか?

分類Dev

freemarkerで変数をチェックするよりエレガントな方法はありますか?

分類Dev

部分文字列を作成するためのよりエレガントな方法はありますか?

分類Dev

Pythonで既存のオブジェクトにメソッドを追加するエレガントな方法はありますか?

Related 関連記事

  1. 1

    Javaでリストを処理するよりエレガントな方法はありますか?(Python VS Java)

  2. 2

    Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

  3. 3

    Rのunitsパッケージから対数変換された軸と単位を処理するエレガントな方法はありますか?

  4. 4

    どちらかのモナドを返す関数を処理する方法

  5. 5

    処理されたデータをカウントするためのエレガントなPythonicの方法はありますか?

  6. 6

    Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

  7. 7

    配列内のどの要素が別のコンテナにあるかを確認するためのエレガントな方法はありますか?

  8. 8

    C(AVRプログラミング)で変数をRAMまたはROMのどちらに格納するかを選択し、すべてのコードで処理する簡単な方法はありますか?

  9. 9

    どちらかのようなエラー処理モナドはどのようにして参照透過性を実現しますか?

  10. 10

    Hateoasはフロントエンドからどのように処理する必要がありますか?

  11. 11

    rebol / red:それがforeachの最後のアイテムであるかどうかを知るためのエレガントな方法はありますか?

  12. 12

    このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

  13. 13

    同じクラスの同じ名前の関数-どちらを呼び出すかを決定するためのエレガントな方法はありますか?

  14. 14

    あるモナドが別のモナドを呼び出すのを処理するクリーンな方法は何ですか?

  15. 15

    Pythonで相対パスを取得するためのエレガントな方法はありますか?

  16. 16

    印刷されたステートメントを、それを印刷したコード行までたどるエレガントな方法はありますか?

  17. 17

    PostgreSQLの例外を処理するエレガントな方法は?

  18. 18

    どちらかのモナドのコンテキストでData.Map.lookupを使用する方法は?

  19. 19

    switch-caseの関数からデータを変更するより効率的でエレガントな方法はありますか?

  20. 20

    PHPには、深くネストされたオプションのノードを使用してJSONを処理するエレガントな方法がありますか?

  21. 21

    関係を定義するエレガントな方法はありますか?

  22. 22

    Javaで複数のメソッドの戻り値の最初の非null値を取得するエレガントな方法はありますか?

  23. 23

    どちらかのモナド:すべての正しい値を収集し、最後にそれらすべてを処理する方法は?

  24. 24

    これらの条件を書くためのよりエレガントな方法はありますか?

  25. 25

    タグレスファイナルでどちらかをエラーに変更するエレガントな方法

  26. 26

    この「if」リストをよりエレガントな方法で書く方法はありますか?

  27. 27

    freemarkerで変数をチェックするよりエレガントな方法はありますか?

  28. 28

    部分文字列を作成するためのよりエレガントな方法はありますか?

  29. 29

    Pythonで既存のオブジェクトにメソッドを追加するエレガントな方法はありますか?

ホットタグ

アーカイブ