私はそれがちょうどPrinciple of Least Astonishmentになると思います。成功または失敗を符号化するためにEither
を使用することは明らかに人々が行うことですが、Either
の唯一の使用ではありません。実際には、Right
を成功させる理由はほとんどなく、Left
は伝統以外の失敗であることはありません。上記のadelbertcのコメントのように、scalazにはValidation
があり、特にこれをエンコードしています。
はさらに、このコードを取る、上記POLAの主張を正当化するには:私はfor
式で.right
投影を使用していますので、
def foo(): Either[Int, Int] = Right(1)
def bar(j: Int): Either[Int, Int] = Left(1)
def baz(z: Int): Either[Int, Int] = Right(3)
// Result is Left(1)
for (a <- foo().right; b <- bar(a).right; c <- baz(b).right) yield c
これがコンパイルされます。ここでLeft(1)
のbar
の場合は失敗のケースであり、その結果ですが、Either
がRight
の場合は想像してください。あなただけの「一または-その他」タイプであるためにあなたのコード内でEither
を使用した場合、あなたは(1で驚かれることでしょう
for (a <- foo(); b <- bar(a); c <- baz(b)) yield c
:上記のコードは次のように表現で.right
投影せずにコンパイルします)これがコンパイルされ、(2)Left(1)
が返され、一見、baz
を実行しないという事実。
要約すると、を使用して成功または失敗をエンコードする場合は、Validation
を使用します。
本当に質問に答えることはできませんが、あなたが探しているものと思われるScalazの「検証」をチェックすると多かれ少なかれです。印象的な例は – adelbertc