2011-09-22 10 views
18
import scalaz._ 
import Scalaz._ 

"abc".parseInt 

यह Validation[NumberFormatException, Int] लौटाएगा। क्या कोई तरीका है कि मैं Validation[String, Int] प्राप्त करने के लिए विफलता पक्ष (जैसे toString) पर कोई फ़ंक्शन लागू कर सकता हूं?स्केलज़ प्रमाणीकरण विफलता पर मानचित्र

उत्तर

19

वहाँ MAB[M[_,_], A, B] कि जब तक है के रूप में वहाँ एक Bifunctor[M] किसी भी M[A, B] के बाईं और दाईं ओर स्थित नक्शे पर परिभाषित तरीकों <-: और :-> की एक जोड़ी है के साथ आ सकते हैं। तो आप ऐसा कर सकते हैं Validation, एक bifunctor होता है:

((_:NumberFormatException).toString) <-: "123".parseInt 

स्काला के प्रकार निष्कर्ष आम तौर पर बाएं से दाएं बहती है, तो यह वास्तव में कम है:

"123".parseInt.<-:(_.toString) 

और कम एनोटेशन की आवश्यकता है।

+0

अच्छा। मुझे आश्चर्य है कि निम्नलिखित एमएबी में उपयोगी हो सकते हैं: डीफ बिमप [सी, डी] (पहला: ए => सी = पहचान [ए] \ _, दूसरा: बी => डी = पहचान [बी] \ _) (निहित बी : बिफुनक्टर [एम]): एम [सी, डी] = बी। बिमाप (मूल्य, पहला, दूसरा)। तो हमें "123" मिलता है .parseInt.bimap (\ _। ToString) –

+0

यह शानदार होगा। एक पुल अनुरोध भेजें। – Apocalisp

11

विफलता पर एक मज़ेदार है। तो तुम

v.fail.map(f).validation 

कर सकता है

वैकल्पिक रूप से

v.fold(f(_).failure, _.success) 

दोनों एक सा वर्बोज़ (FailProjection, मान्यता के रूप में टाइप करने के लिए इसे से बाहर प्राप्त करने के लिए असफल)। हो सकता है कि किसी को scalaz से अधिक परिचित कुछ बेहतर

+0

काम करने के लिए 'f औरthen विफलता 'नहीं मिल सकता:' 123 ".parseInt.fold (_। ToString और फिर विफलता)' प्रिंट्स 'टाइप मिस्चैच'। दूसरा ठीक काम करता है। – huynhjl

+1

@huynhjl: गुना दो कार्य करता है: त्रुटि मामले के लिए पहला, सफलता के मामले के लिए दूसरा। v.fold (_। toString.fail, _.success) –

+0

काम करता है लेकिन गुना तर्कों में डिफ़ॉल्ट मान हैं (पहचान) क्या वे नहीं हैं? –

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