2015-10-07 6 views
5

Nick Partridge's presentation on deriving scalaz में से `<|*|>` के 7 बराबर, scalaz के एक पुराने संस्करण के आधार पर, वह एक समारोह का उपयोग कर सत्यापन का परिचय जो परीक्षण लागू करता है और विफलता संदेश के साथ एक सत्यापन देता है। स्केलज़ 7 का उपयोग करके मुझेscalaz scalaz 6

scala> even(1) <|*|> even(2) 
<console>:18: error: value <|*|> is not a member of scalaz.Validation[scalaz.NonEmptyList[String],Int] 
     even(1) <|*|> even(2) 
      ^

इस संयोजक के बराबर 7 बराबर क्या है?

+0

नहीं यदि आप इसके बजाय का उपयोग करने के 'चाहते हैं | @ |' ऑपरेटर? आपके द्वारा पोस्ट किया गया वीडियो इसका उल्लेख नहीं करता है लेकिन आप इसके बारे में और अधिक जानकारी प्राप्त कर सकते हैं: http://eed3si9n.com/learning-scalaz/Validation.html – mjaskowski

+0

विशेष रूप से आप फिर 'स्कैला> लिख सकते हैं (यहां तक ​​कि (1) | @ | यहां तक ​​कि (2) | @ | यहां तक ​​कि (3)) {_ + _ + _} ' असफलता (गैर-लक्षणसूची (यहां तक ​​कि: 1, यहां तक ​​कि नहीं: 3))' और 'स्कैला> (यहां तक ​​कि (2) | @ | यहां तक ​​कि (4) | @ | यहां तक ​​कि (6)) {_ + _ + _}) '' सफलता (12) ' – mjaskowski

+0

@mjaskowski' | @ | 'बहुत सामान्य है, और ऐसे मामलों में जहां आप बस चाहते हैं एक tuple में दो मानों को एक साथ जोड़ने के लिए, 'tuple' (जिसे पहले '<|*|>' के रूप में जाना जाता है) अधिक उपयुक्त है। –

उत्तर

5

यह अब tuple कहा जाता है, तो आप उदाहरण के लिए लिख सकते हैं:

import scalaz._, Scalaz._ 

def even(x: Int): Validation[NonEmptyList[String], Int] = 
    if (x % 2 == 0) x.success else s"not even: $x".failureNel 

val pair: ValidationNel[String, (Int, Int)] = even(1) tuple even(2) 

दुर्भाग्य से मैं वहाँ के अंतिम 6.0 टैग बाहर की जाँच से बात इस तरह का पता लगाने के लिए एक बेहतर तरीका है यकीन नहीं है स्रोत, खोज, और फिर हस्ताक्षर की तुलना।

+1

7.0 में एक 'tuple' को इंगित करने वाला एक बहिष्करण एनोटेशन था, लेकिन यह स्वाभाविक रूप से 7.1 में चला गया है। – Hugh

+0

एक टाइपो है। असफलता विफल होना चाहिए नेल –

+0

@ क्लाउडटेक 'असफलता' अभी भी 7.1 में है, लेकिन यह बहिष्कृत है, इसलिए मैंने इसे बदल दिया है। –

-1

आप |@| ऑपरेटर का उपयोग करना चाहते हैं।

scala> (even(1) |@| even(2) |@| even(3)) { (_,_,_) } 
<console> Failure(NonEmptyList(not even: 1, not even: 3)) 

scala> (even(2) |@| even(4) |@| even(6)) { (_,_,_) } 
<console> Success((2,4,6)) 

तुलना कि tuple ऑपरेटर के लिए:

scala> even(1) tuple even(2) tuple even(3) 
<console> Failure(NonEmptyList(not even: 1, not even: 3)) 

scala> even(2) tuple even(4) tuple even(6) 
<console> Success(((2,4),6)) 
+2

आप निश्चित रूप से _can_ का उपयोग '| @ |' करते हैं, लेकिन मुझे कोई संकेत नहीं दिख रहा है कि OP _wants_ यही है। '| @ |' स्कालाज़ 6 में मौजूद था और वही काम किया जो 7-<|*|> में करता है 'कुछ और विशिष्ट है जिसका नाम बदल गया था। –

+0

प्रमाणीकरण के परिदृश्य में 'tuple'' पर 'tuple' क्या अच्छा है? – mjaskowski

+0

परिदृश्य क्यों मायने रखता है? जब आप एक ट्यूपल चाहते हैं, तो 'tuple' अधिक सटीक, कम शक्तिशाली, अधिक पठनीय, और' | @ | 'से इरादे के बारे में अधिक स्पष्ट है- ये इसे पसंद करने के सभी कारण हैं। –

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