मुझे लगता है कि यह Principle of Least Astonishment पर आता है। Either
का उपयोग करते हुए सफलता या विफलता एन्कोड करने के लिए स्पष्ट रूप से कुछ लोग करते हैं, लेकिन यह Either
का ही उपयोग नहीं है। वास्तव में, Right
सफलता और Left
परंपरा के अलावा अन्य विफलता होने का अधिक कारण नहीं है। adelbertc की टिप्पणी से ऊपर उल्लेख के रूप में, scalaz Validation
जो विशेष रूप से इस सांकेतिक शब्दों में बदलना है।
आगे ऊपर POLA दावा का औचित्य साबित करने के लिए, इस कोड को ले:
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
यह संकलित क्योंकि मैं for
अभिव्यक्ति में .right
प्रक्षेपण का उपयोग कर रहा हूँ। यह भावना यहाँ बनाता bar
में Left(1)
विफलता का मामला है और इसलिए है कि परिणाम है, लेकिन कल्पना यदि Either
Right
-biased था। ऊपर दिए गए कोड की तरह अभिव्यक्ति में .right
अनुमानों के बिना संकलन होगा:
for (a <- foo(); b <- bar(a); c <- baz(b)) yield c
यदि आप अपने कोड में Either
इस्तेमाल किया सिर्फ एक "एक या-अन्य" प्रकार हो, तो आप से हैरान किया जाएगा (1) तथ्य यह है कि इस संकलन होगा और (2) यह Left(1)
देता है कि और उचित रूप में कभी नहीं baz
निष्पादित करता है।
सारांश में, Validation
का उपयोग करें यदि आप Either
का उपयोग सफलता या विफलता को एन्कोड करने के लिए करना चाहते हैं।
वास्तव में सवाल का जवाब नहीं देता है, लेकिन यदि आप स्कालज़ की 'सत्यापन' की जांच करते हैं जो कि आप जो खोज रहे हैं, उतना ही कम या कम है। प्रभावशाली उदाहरण के लिए – adelbertc