कैसे कर सकते हैं मैं (सर्वोत्तम) एक विकल्प आज़माएं में एक विधि कॉल द्वारा दिया (वरीयता द्वारा, हालांकि एक या तो या एक scalaz \/
या यहां तक कि एक मान्यता ठीक हो सकता है) अगर उचित एक विफलता मूल्य निर्दिष्ट करने सहित कन्वर्ट?मैं कैसे (सर्वोत्तम) में एक प्रयास करें एक विकल्प बदल सकता हूँ?
उदाहरण के लिए, मैं निम्नलिखित कोड है, जो kludgy महसूस करता है, लेकिन कम से कम (के सबसे) क्या करता है काम किया है:
import scala.util._
case class ARef(value: String)
case class BRef(value: String)
case class A(ref: ARef, bRef: BRef)
class MismatchException(msg: String) extends RuntimeException(msg)
trait MyTry {
// Given:
val validBRefs: List[BRef]
// Want to go from an Option[A] (obtained, eg., via a function call passing a provided ARef)
// to a Try[BRef], where the b-ref needs to be checked against the above list of BRefs or fail:
def getValidBRefForReferencedA(aRef: ARef): Try[BRef] = {
val abRef = for {
a <- get[A](aRef) // Some function that returns an Option[A]
abRef = a.bRef
_ <- validBRefs.find(_ == abRef)
} yield (abRef)
abRef match {
case Some(bRef) => Success(bRef)
case None => Failure(new MismatchException("No B found matching A's B-ref"))
}
}
}
यह लगता है जैसे वहाँ के लिए अंतिम मैच होने के लिए एक तरह से किया जाना चाहिए एक नक्शा या flatMap या इसी तरह के निर्माण में बदल गया और समझ के लिए पूर्ववर्ती में शामिल किया।
इसके अलावा, अगर मैं एआरएफ से एक विकल्प [ए] विफल करने के लिए कॉल विफल रहता हूं (बीआरएफ चेक विफल होने की तुलना में कोई नहीं लौटा) तो मुझे एक अलग विफलता संदेश निर्दिष्ट करने में सक्षम होना पसंद करेंगे (मुझे केवल एक कारण जानने की परवाह है विफलता के लिए, इसलिए एक scalaz प्रमाणीकरण आदर्श फिट की तरह महसूस नहीं करता है)।
यह एक इकाई ट्रांसफार्मर का उपयोग करने के लिए एक उपयुक्त जगह है? यदि हां, तो scalaz एक उपयुक्त एक प्रदान करता है, या किसी को यह कैसा लगेगा का एक उदाहरण दे सकते हैं?
क्या आपका मतलब है 'कोशिश करें {abRef.getOrElse (नया मिस्चैच अपवाद ("कोई बी मिलान मिलान ए के बी-रेफ"))} या 'abRef.map {सफलता (_)} .getOrElse (विफलता (नया मिस्चैच अपवाद ("नो बी मिलान ए के बी-रेफ मिला")) '? – senia
@senia अधिक बाद वाले: 'abRef.map {सफलता (_)} .getOrElse (विफलता (नया मिस्चैच अपवाद (" कोई बी मिलान ए के बी-रेफ मिला)) ', लेकिन ऐसा लगता है जैसे यह संभव होना चाहिए - और अधिक मूर्खतापूर्ण - इसे किसी भी तरह समझने के लिए। – Shadowlands
एक साइड नोट के रूप में, 'विकल्प' पर 'फ़िल्टर' का उपयोग क्यों न करें- यानी,' प्राप्त करें [ए] (एआरएफ)। मैप (_। बीआरएफ) .filter (validBRefs.contains) 'के साथ अपनी' समझ 'के लिए प्रतिस्थापित करें। ? –