2012-09-25 36 views
7

मैं निम्नलिखित हस्ताक्षरConvert सूची [स्ट्रिंग] एक समारोह में ValidationNEL [स्ट्रिंग, एक] में

def reject[A](errors: List[String]): ValidationNEL[String, A] 

इस के बाद से के साथ एक समारोह है है एक विधि अस्वीकार, प्रकार A लौटा दी कभी नहीं होगा, लेकिन मैं जरूरत हस्ताक्षर से मेल खाने के लिए इसे प्रतिबिंबित किया जाना चाहिए। मैं इस प्रकार के रूप में मेरे वांछित परिणाम प्राप्त करने के लिए प्रकार lambdas के साथ चारों ओर खिलवाड़ किया गया था:

errors.map(Failure[String, A](_).liftFailNel).sequence[({type l[a] = ValidationNEL[String, a]})#l, A] 

इस प्रकार List[A] का उपयोग करता है (या प्रतीत होता है), बल्कि मेरी इच्छित प्रकार A से। क्या परिणाम देखने के लिए कोई मानक तरीका है जिसे मैं ढूंढ रहा हूं?

उत्तर

5

क्योंकि errors खाली List हो सकता है, और आप A टाइप करने के लिए खुद को बाध्य कर रहे हैं, मुझे नहीं लगता कि आप इसे कुल फ़ंक्शन के रूप में लिख सकते हैं। इस प्रकार के हस्ताक्षर को लिखने के लिए, खाली सूची केस का नाटक करके आपको धोखा देने की आवश्यकता होगी, उदाहरण के लिए नहीं है।

def reject[A](errors: List[String]): ValidationNEL[String, A] = 
    Failure(errors.toNel.get) // bad! 

संपादित करें: Apocalisp के रूप में बताया, तो आप निश्चित रूप से इस कुल समारोह बना सकते हैं, खाली सूची के लिए एक त्रुटि शुरू करने से।

def reject[A](errors: List[String]): ValidationNEL[String, A] = 
    Failure(errors.toNel getOrElse NonEmptyList("Error: There were no errors!")) 

क्यों एक के रूप में errors पारित नहीं: लेकिन मैं सिर्फ यह है कि अगर errors रनटाइम पर गणना की जाती है, और मुझे लगता है यह नहीं आपके उपयोग के मामले, के रूप में यह इस तरह के रूप मूर्खतापूर्ण त्रुटियों के लिए नेतृत्व करेंगे है क्या करना होगा NonEmptyList इसके बजाय - संभवतः आप केवल इस फ़ंक्शन का उपयोग करते हैं यदि आपके पास संकलन समय पर उपयोग करने में त्रुटियां हैं।

def reject[A](errors: NonEmptyList[String]): ValidationNEL[String, A] = 
    Failure(errors) 

आप NonEmptyList.apply के हस्ताक्षर को कॉपी (और String करने के लिए इसे विशेषज्ञता) द्वारा उपयोग करने के लिए इस terser बना सकते हैं:

def reject[A](h: String, t: String*): ValidationNEL[String, A] = 
    Failure(NonEmptyList(h, t: _*)) 

के लिए इसे बाहर की कोशिश करते हैं:

scala> reject("foo", "bar", "baz") 
res0: scalaz.package.ValidationNEL[String,Nothing] = Failure(NonEmptyList(foo, bar, baz)) 
+0

तुम सिर्फ कर सकता है खाली सूची भी एक त्रुटि :) – Apocalisp

+0

यह सच है, मैंने उस बारे में नहीं सोचा (डुह)। यह उपयोगी होगा अगर रनटाइम पर 'त्रुटियों' की गणना की जाती है, लेकिन मुझे लगता है कि वह अपने कोड में अक्षर लिख रहे होंगे। मुझे संदेह है "ओह, आप teh कोड में त्रुटि लिखना भूल गए" रनटाइम पर एक उपयोगी त्रुटि होगी। –

+1

या कुछ वास्तव में उपयोगी "त्रुटि: कोई त्रुटि नहीं थी।" – Apocalisp