2012-12-11 16 views
7

मैं अपने स्कैला कोड में मोनाडिक शैली का उपयोग शुरू करने की योजना बना रहा हूं, दूसरों के बीच, थ्रेडिंग स्टेटस। यहां 3 monadic कार्यों के संयोजन (और दुष्प्रभावों के बारे में केवल देखभाल) के एक सरल उदाहरणस्कालाज़ - समझने के लिए सूची और राज्य मोनाड का संयोजन

import scalaz._ 
import Scalaz._ 

object MonadTest { 
    def adder(i: Int) = State[String, Int] ({str: String => (str + i.toString + " ", i) }) 
    val oneTwoThreeMonad = for { 
    m1 <- adder(1) 
    m2 <- adder(2) 
    m3 <- adder(3) 
    } yield m3 
    oneTwoThreeMonad("start: ")._1 //String = "start: 1 2 3 " 
} 

है यह सब सुंदर आत्म व्याख्यात्मक है और अपेक्षा के अनुरूप काम करता है। लेकिन इस दृष्टिकोण के लिए मेरे लिए वास्तव में उपयोगी होना है, मैं इसे समझने के लिए List के साथ गठबंधन करने में सक्षम होना चाहता हूं। यहाँ दिखाने के लिए मैं क्या मतलब है की (काम नहीं कर रहा) कोड एक सा:

val list = List(1, 2, 3) 

val oneTwoThreeBis = for { 
    i <- list 
    mx <- adder(i) 
} yield mx 

मूल रूप से मैं एक List से तर्क के आधार पर monads गठबंधन करने के लिए सक्षम होने के लिए चाहते हैं - के तत्वों में से प्रत्येक पर monadic समारोह चलाने list और जब मैं जाता हूं तो साइड इफेक्ट्स जमा करता हूं। मैं समझता हूं कि उदाहरण वाक्यविन्यास काम नहीं करता है और मैं देखता हूं कि ऐसा क्यों नहीं करता - मैं बस एक साफ, सुरुचिपूर्ण समकक्ष की तलाश में हूं।

मुझे यकीन है कि स्कालज़ मोनैड ट्रांसफार्मर का उपयोग करके इसे हासिल करना संभव है, विशेष रूप से StateT के साथ, लेकिन मुझे सच में यकीन नहीं है कि यह करने के बारे में कोई कैसे होगा।

पीएस। मैं स्कालज़ 7.0-एम 3 का उपयोग कर रहा हूं, इसलिए सिंटैक्स सबसे आम 6.x से थोड़ा अलग हो सकता है।

उत्तर

9

मुझे यकीन है कि मैं समझता हूँ कि आप के लिए क्या चाहिए, तो नहीं कर रहा हूँ, लेकिन यह लगता है कि आप चाहते हैं और अधिक traverse यहाँ (जहां traverse हास्केल के mapM की एक अधिक सामान्य संस्करण है) की तरह कुछ:

import scalaz._, Scalaz._ 

def adder(i: Int) = State[String, Int](str => (str + i.toString + " ", i)) 

List(1, 2, 3).traverseS(adder)("start: ")._1 

अपेक्षा के अनुरूप यह, निम्नलिखित प्रिंट होगा:

res0: String = "start: 1 2 3 " 

ध्यान दें कि मैं traverseS उपयोग कर रहा हूँ (जहां State के लिए S खड़ा) WRI से बचने के लिए बल्कि गन्दा प्रकार पैरामीटर को दूर करें, लेकिन traverse किसी भी समय जब आप किसी ट्रैवर्सबल पर एक मोनैडिक फ़ंक्शन को मैप करना चाहते हैं तो अधिक आम तौर पर उपयोगी होता है।

मुझे StateT उदाहरण देने में प्रसन्नता हो रही है यदि यह वही नहीं है जो आप चाहते थे, लेकिन यह आपके साथ List[(String, Int)] टाइप करने वाला कुछ खत्म हो जाएगा।

+0

ऐसा लगता है कि मैं वास्तव में क्या देख रहा हूं। लेकिन यह इस तथ्य को नहीं बदलेगा कि मुझे जल्दी या बाद में अभ्यास में राज्य ट्रांसफार्मर का उपयोग करना सीखना होगा;) – nietaki

+1

मुझे अभी एहसास हुआ कि मैंने पहले से ही आपके उत्तरों में से एक को पढ़ा है जिसमें 'ट्रैवर्स' और 'ट्रैवर्स एस' का विस्तृत विवरण है। और इसके लिए भी आपकी प्रशंसा की। मैं कल्पना नहीं कर सकता कि यह मेरे साथ कैसे नहीं रहा ... – nietaki

+1

अगर किसी को स्कालज़ की बजाय बिल्लियों के साथ कुछ करने की ज़रूरत है, तो ध्यान दें कि कोई 'ट्रैवर्स' नहीं है लेकिन मेरे पास 'traverseU' का उपयोग करके इसका एक उदाहरण है : https://github.com/benhutchison/gesture/blob/master/core/jvm/src/test/scala/gesture/GestureProcessorSpec.scala#L34 –

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