2011-12-13 23 views
5

को समझने की कोशिश कर रहा हूं मैं अपने लिफ्ट प्रोजेक्ट में स्कालाज़ का उपयोग शुरू करने की कोशिश कर रहा हूं। उस उद्देश्य के लिए मैं शैली को पूरा करने के लिए कुछ कोड लिख रहा हूं। एक उपयोगकर्ता में लॉग इन करने के लिए एक कोड पर विचार करें:स्केलज़ राज्य मोनड

def login: CssSel = { 
    var password = "" 
    def submit() { 
     if (doLogin) S.redirectTo("/index") 
     else S.error("Wrong password") 
    } 
    "name=pwd" #> SHtml.password(password, password = _) & 
    "type=submit" #> SHtml.onSubmitUnit(submit) 
    } 

तो, यह किसी भी तरह एक राज्य इकाई का उपयोग कर फिर से लिखा जाना चाहिए। लेकिन मुझे बस नहीं मिला, कैसे। इस कोशिश कर रहा है:, अपडेट किया गया उदाहरण उत्तरों के अनुसार:

val result = for { 
    s  <- init[String] 
    pass <- SHtml.password(s, put(_)) 
    newPass <- init[String] 
    res  <- "name=pwd" #> pass & 
       "type=submit" #> SHtml.onSubmit { _ => 
       if (User.logIn("username", newPass)) S.redirectTo("/index") 
       else S.error("Wrong password") 
       } 
} yield (newPass, res) 
result ! "" 

युपीडी।

स्केलज़ में राज्य मोनैड पर कोई भी अच्छा ट्यूटोरियल/स्पष्टीकरण, gets, put आदि का उपयोग करने का तरीका दिखाता है?

+0

क्या आपने मेरे पिछले प्रश्न/उत्तर पर एक नज़र डाली है? http://stackoverflow.com/questions/7734756/scalaz-state-monad-examples – huynhjl

+2

मुझे यकीन नहीं है कि यह वास्तव में व्यावहारिक है।आप केवल कुछ राज्य मोनैड का उपयोग नहीं कर सकते हैं और जादुई रूप से अपने कोड में सभी 'var' से छुटकारा पा सकते हैं। इसके लिए काम करने के लिए आपके पास राज्य परिवर्तनों को चुनने का कुछ साधन होना चाहिए जो लिफ्ट के 'SHtml' के कॉलबैक विधियों का समर्थन नहीं करते हैं। (मुझे लगता है कि लिफ्ट की पूरी अवधारणा ठीक है कि आप कई बंदियों में छिपे हुए चर का उपयोग करते हैं।) मुझे गलत साबित होने में खुशी होगी, हालांकि, और इसका एक उदाहरण उदाहरण देखें। – Debilski

+0

आप सही हैं। धन्यवाद। – folone

उत्तर

2

चेतावनी: मैंने कभी भी स्काला राज्य मोनड का उपयोग नहीं किया है। हालांकि, मुझे लगता है कि ऐसा लगता है कि यह व्यवहार करता है जैसा कि आप कहते हैं।

onSubmit वर्ष pass, नहीं देखता, मैं कर रहा हूँ put 'टिंग

ठीक है, तुम क्या कर रहे देखो:

... { pass => 
    ... SHtml.password(pass, _ => put(pass)) 
    ... User.logIn("username", pass) 
} 

सबसे पहले, मुझे नहीं पता लगता है कि आप जो भी सोच रहे हैं उसे डाल रहे हैं। इसके बजाय इसे आजमाएं:

... SHTML.password(pass, newPass => put(newPass)) 

दूसरा, मुझे नहीं लगता कि आपको वह मिल रहा है जो आपको लगता है कि आप क्या प्राप्त कर रहे हैं। मैं कोई सुराग नहीं कैसे Scalaz राज्य इकाई काम करता है, लेकिन यह कुछ इस तरह होना चाहिए:

... User.logIn("username", get()) 

मुझे नहीं लगता कि आप pass का उपयोग बदलने के राज्य का उल्लेख करने के है, pass केवल वह मूल्य है जो राज्य गणना के लिए शुरू किया जाता है, जो बताएगा कि User.logIn("username", pass) "पुराना" ओसवर्ड का उपयोग क्यों कर रहा है।

इसके अलावा (हालांकि मुझे SHtml या & क्या पता नहीं है) मुझे अत्यधिक संदेह है कि यह वास्तव में काम करेगा। यह समझाना मुश्किल है कि मुझे ऐसा क्यों लगता है, लेकिन SHtml के साथ इसका कोई संबंध नहीं है, शायद डेबिलस्की ने टिप्पणी की, जैसा कि राज्य के भीतर अभिव्यक्तियों के निर्माण के अनुकूल नहीं है। SHtml.password की अपेक्षा करता है कि आप इसे मनमाने ढंग से साइड-इफेक्टिंग फ़ंक्शन दें; यह डिज़ाइन विकल्प तुरंत उस चीज़ के लिए एक कार्यात्मक दृष्टिकोण के लिए असभ्य बनाता है जिसे आप करने का प्रयास कर रहे हैं।

+1

यह एक अपूर्ण और संभवतः भयानक उत्तर है। जो वास्तव में लिफ्ट और स्कालाज़ के बारे में जानते हैं: कृपया मेरे निष्कर्षों की पुष्टि/इनकार करने के लिए उपयुक्त/वोट दें। –

2

सबसे अच्छा scalaz उदाहरण मैं पाया है अब तक ये हैं: http://etorreborre.blogspot.com/2011/06/essence-of-iterator-pattern.html?m=1 http://etorreborre.blogspot.com/2011/12/pragmatic-io.html?m=1 और अनुवर्ती अप। scalaz उदाहरण से यह उदाहरण :) https://github.com/scalaz/scalaz/blob/scalaz-seven/example/src/main/scala/scalaz/example/WordCount.scala

शब्द में उदाहरण गिनती यह 3 मूल्यों में गिना जाता है और wordcount मूल्य राज्य का उपयोग के माध्यम से की जाती है। आशा है कि ये आपकी मदद करेगा।