2012-09-05 13 views
5

मुझे डिजाइन निर्णयों को जानने में दिलचस्पी है क्यों scala.Either एक मोनड के रूप में नहीं किया गया था। पहले से ही कैसे राइट-biasing के लिए Either उदाहरण के लिए, पर कुछ चर्चा भी बना हुआ है:स्केलस या तो मोनड क्यों नहीं है?

लेकिन बहुत ज्यादा जानकारी के वहाँ उल्लेख कर रहे हैं और मैं नहीं मिल सका यह पूरा होने के बारे में एक संपूर्ण अवलोकन है। क्या कोई सही पक्षपातपूर्ण Either रखने के लाभों के बारे में एक अवलोकन दे सकता है, इस तरह से करने के लिए और सही पक्षपातपूर्ण Either (यदि वे भी मौजूद हैं) नहीं होने के लाभों के बारे में?

+0

वास्तव में सवाल का जवाब नहीं देता है, लेकिन यदि आप स्कालज़ की 'सत्यापन' की जांच करते हैं जो कि आप जो खोज रहे हैं, उतना ही कम या कम है। प्रभावशाली उदाहरण के लिए – adelbertc

उत्तर

7

मुझे लगता है कि यह 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) विफलता का मामला है और इसलिए है कि परिणाम है, लेकिन कल्पना यदि EitherRight -biased था। ऊपर दिए गए कोड की तरह अभिव्यक्ति में .right अनुमानों के बिना संकलन होगा:

for (a <- foo(); b <- bar(a); c <- baz(b)) yield c 

यदि आप अपने कोड में Either इस्तेमाल किया सिर्फ एक "एक या-अन्य" प्रकार हो, तो आप से हैरान किया जाएगा (1) तथ्य यह है कि इस संकलन होगा और (2) यह Left(1) देता है कि और उचित रूप में कभी नहीं baz निष्पादित करता है।

सारांश में, Validation का उपयोग करें यदि आप Either का उपयोग सफलता या विफलता को एन्कोड करने के लिए करना चाहते हैं।

+0

+1। – Frank

5

मुझे नहीं पता कि यह मूल कारण था, लेकिन कम से कम एक अच्छा कारण है। स्कैला में, for समझ को तर्क से अधिक की आवश्यकता होती है कि पूर्ण कार्यक्षमता प्राप्त करने के लिए यह एक मोनड है। विशेष रूप से, वहाँ की तरह

for (a <- ma if a > 7; /*...*/) yield /*...*/ 

निर्माणों जो की आवश्यकता है कि इकाई एक इकाई-साथ-जीरो (ताकि आप इसे खाली कर सकते हैं अगर हालत विफल रहता है) हो रहे हैं।

Either समझदारी से नहीं हो सकता है एक इकाई-साथ-जीरो (Either[Unit,B], जहां Left(()) शून्य हो सकता है को छोड़ कर)।

जाने का एक तरीका यह कहना है: ठीक है, ठीक है, बस इस तरह की समझ के लिए उपयोग न करें। जाने का एक और तरीका यह कहना है: ठीक है, ठीक है, किसी भी मोनाद को परेशान मत करो। यह निश्चित रूप से व्यक्तिगत पसंद, की बात है, लेकिन मैं Either होने में लालित्य का एक निश्चित कमी देख सकते हैं (विशिष्ट स्काला में प्रदान किए गए समान monads के अलावा) अपने चेहरे पर असफल हो जाते हैं एक बार आप पूरी शक्ति for आप देता है उपयोग करने के लिए प्रयास करें।

संबंधित मुद्दे