के साथ आवेदकों को फ़ंक्शन कैसे लिखें स्केलज़ 6 सीखते समय, मैं टाइप-सुरक्षित पाठकों को सत्यापन वापस करने की कोशिश कर रहा हूं। यह मेरा नया प्रकार हैं:स्केलज़
type ValidReader[S,X] = (S) => Validation[NonEmptyList[String],X]
type MapReader[X] = ValidReader[Map[String,String],X]
और मैं (*) दो ints और तार के लिए नक्शे-पाठकों बनाने कार्यों:
def readInt(k: String): MapReader[Int] = ...
def readString(k: String): MapReader[String] = ...
निम्न मानचित्र को देखते हुए:
val data = Map("name" -> "Paul", "age" -> "8")
मैं नाम और उम्र को पुनः प्राप्त करने के लिए दो पाठकों को लिख सकते हैं:
val name = readString("name")
val age = readInt("age")
println(name(data)) //=> Success("Paul")
println(age(data)) //=> Success(8)
सब कुछ ठीक काम करता है, लेकिन अब मैं दोनों पाठकों की रचना करने के एक Boy
उदाहरण का निर्माण करना चाहते:
case class Boy(name: String, age: Int)
मेरे सबसे अच्छा ले रहा है:
val boy = (name |@| age) {
(n,a) => (n |@| a) { Boy(_,_) }
}
println(boy(data)) //=> Success(Boy(Paul,8))
यह उम्मीद काम करता है के रूप में है, लेकिन अभिव्यक्ति के साथ अजीब है आवेदक बिल्डरों के दो स्तर। क्या काम करने के लिए निम्नलिखित वाक्यविन्यास प्राप्त करने का कोई तरीका है?
val boy = (name |@| age) { Boy(_,_) }
(*) पूर्ण और में runnable कार्यान्वयन: https://gist.github.com/1891147
अद्यतन: यहाँ संकलक त्रुटि संदेश है कि मैं ऊपर या डैनियल सुझाव लाइन कोशिश कर मिलता है:
[error] ***/MapReader.scala:114: type mismatch;
[error] found : scalaz.Validation[scalaz.NonEmptyList[String],String]
[error] required: String
[error] val boy = (name |@| age) { Boy(_,_) }
[error] ^
मैं एक जवाब बाद में पोस्ट करेंगे, लेकिन एक संकेत के रूप में, याद रखें कि 'आवेदक [जी]' और 'आवेदक [एफ] 'का मतलब है' आवेदक [[x] एफ [जी [एक्स]]'। स्कालज़ 7 में, इस तथ्य के साक्षी 'आवेदक # लिखें' गवाह। '| @ |' वाक्यविन्यास का उपयोग करने के बजाय, शुरू करने के लिए टाइप क्लास के साथ सीधे काम करें। – retronym
धन्यवाद, लेकिन मुझे अभी भी यह नहीं मिला है, इसलिए मैं आपके उत्तर का इंतजार करूंगा। ध्यान दें कि मैं स्केलज़ 6 का उपयोग कर रहा हूं (प्रश्न अपडेट किया गया)। – paradigmatic
@paradigmatic क्या आपने स्पष्ट रूप से 'लागू' का उपयोग करने का प्रयास किया है?'(नाम | @ | आयु) की तरह {लड़का (_, _)}' लागू करें? –