2016-02-16 3 views
5

स्कैलाज़ में कनवर्ट करें, Option[Validation[E, A]] को Validation[E, Option[A]] में बदलने के लिए बेवकूफ तरीका क्या है?एक विकल्प [प्रमाणीकरण [ई, ए]] को एक प्रमाणीकरण [ई, विकल्प [ए]]

उदाहरण के लिए, निम्न काल्पनिक कोड में:

def convert(x: Option[Validation[E, A]]): Validation[E, Option[A]] =  
    /* ??? */ 

def validateThing(thing: A): Validation[E, A] = 
    /* whatever */ 

def exampleUseCase(maybeThing: Option[Thing]): Validation[E, Option[Thing]] = { 
    val validated: Option[Validation[E, Thing]] = a.map(validateThing(_)) 

    // ... 

    val result: Validation[E, Option[Thing]] = convert(validated) 
    result 
} 

क्या convert के कार्यान्वयन मुहावरेदार ScalaZ में की तरह लग रहे हैं?

+1

में मदद करेगा, मैं कहूंगा कि यह कनवर्टन मुझे अधिक समझ में नहीं आता है। यदि संभवतः 'शायद टिंग'' कोई नहीं है तो आप क्या परिणाम देंगे? संभवतः असफल सत्यापन, यह कोई नहीं है, अगर यह कोई नहीं है तो आप मूल्य निकाल सकते हैं और 'सफल' मामले के रूप में रख सकते हैं, तो आपको 'विकल्प' की आवश्यकता नहीं है। – 4lex1v

+0

'मान्य' और 'validateThing' hypothetical हैं, बस इस तरह के रूपांतरण * हो सकता है के संदर्भ को दिखाने के लिए। मुझे केवल दिलचस्पी है कि 'कन्वर्ट' का कार्यान्वयन क्या होगा। – kes

+0

लेकिन 'शायद टिंग'' कोई नहीं होने पर क्या उम्मीद की जा सकती है इसके विशिष्ट प्रश्न का उत्तर देने के लिए: 'कोई नहीं' का सफल सत्यापन। – kes

उत्तर

4

मैं यहां दो संभावित समाधान देख सकता हूं। शायद सबसे आसान एक तर्क है, उदाहरण के पर पैटर्न मिलान का उपयोग कर:

def convert[A](v: Option[Validation[Throwable, A]]): Validation[Throwable, Option[A]] = { 
    v match { 
    case None => Validation.success(None) 
    case Some(valid) => valid.map(Some(_)) 
    } 
} 

Scalaz आधारित समाधान के लिए, मैं के बारे में sequence इस तरह से आप मान्यता के बजाय ValidationNel, का उपयोग करना संभव मुद्दों एकत्र करने के लिए, आप कर सकते हैं की जरूरत है सोच रहा था, Traversable साथ convert लागू:

def convert[A](v: Option[ValidationNel[Throwable, A]]): ValidationNel[Throwable, Option[A]] = 
    Traverse[Option].sequenceU(v) 

कृपया ध्यान दें वास्तव में मैं सिर्फ sequence के बजाय sequenceU उपयोग कर रहा हूँ कि, यह उचित प्रकार निष्कर्ष के लिए आंतरिक Scalaz जादू से ज्यादा कुछ नहीं है कारण मान्यता दो प्रकार पैरामीटर है। उम्मीद है कि यह

+2

यदि आप सबकुछ आयात करते हैं या कम से कम 'std.option._' और' syntax.traverse._' हैं तो आप केवल 'c.sequenceU' लिख सकते हैं। –

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