2016-12-06 4 views
1

最後に、スカラ2.12には右バイアスがかかっています。私はそれが検証目的のために使用できると聞きましたが、私はこれを想像することはできません。私は良い例を見つけることができません。
このモナドがどのように検証に役立つか、誰かに教えていただけますか?また、他のどのユースケースもこの拡張によってカバーされる可能性がありますか?スカラバリデーション - 右偏向どちらか

+0

「どちらか」が「右寄せ」だと思いますか? – jwvh

+2

公式のScalaリリースノート - https://www.scala-lang.org/news/2.12.0 – PawelN

+2

[Either'に関するドキュメント](http://typelevel.org/cats/datatypes/either .html)。 –

答えて

5

Either[A, B]正しくバイアスされているかどうかは、検証/例外処理には適していますか?右寄せにすることで、それ以上の操作を簡単に作成できます。

オブジェクトを検証する場合、どのような形式で検証メソッドを実行できますか?最も単純な形式は、述語、メソッド任意のオブジェクトを取得し、Boolを返すようになります:

sealed trait Base 
case class Foo(I: Int) 
case class Bar(s: String) 

def isValid(b: Base): Bool = b match { 
    case Foo(i) => i > 18 
    case Bar(s) => s.length > 5 
} 

これは動作しますが、時には十分ではないかもしれません。これがAPIを直面しているユーザーの場合、受信したオブジェクトのエラーの可能性を明示して、ユーザーが間違ったことをすぐに理解できるようにするにはどうすればよいでしょうか?

Boolを返す代わりに、エラーのリストを返すか、有効なオブジェクト自体を返しますか?これは私たちがさらに構成することができます:

def validate(b: Base): Either[List[String], Base] = b match { 
    case Foo(i) => if (i > 18) Right(b) else Left(List("i must be greater than 18")) 
    case Bar(s) => if (s.length > 5) Right(b) else Left(List("s must be longer than 5 chars")) 
} 

今、私たちは、その上にマッピングすることができます。

val foo = Foo(42) 
val result = validate(foo).map { case Foo(i) => s"yay, valid foo number: $i" } 
result match { 
    case Left(errors) => println(s"Something went wrong: ${errors.mkString(", ")}) 
    case Right(msg) => println(msg) 
} 

は、我々は2つのことを得ることができます。まず、他の操作で検証を行い、エラー処理を遅らせることができます.2番目は明示的なエラーです。これをさらに利用して、これらのエラーを型指定して、ユーザーが一致させて、ユースケースごとにエラー処理を適用できるようにすることもできますが、それは別の時間です。

+1

今私はそれを持っている。私はもっ​​と洗練されたものを考えていましたが、私は間違っていました。これは簡単で、私がしたいことをやっている。私は私の解決策を工夫してみました。ありがとう。 – PawelN

関連する問題