मैं अपने स्कैला कोड में मोनाडिक शैली का उपयोग शुरू करने की योजना बना रहा हूं, दूसरों के बीच, थ्रेडिंग स्टेटस। यहां 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 से थोड़ा अलग हो सकता है।
ऐसा लगता है कि मैं वास्तव में क्या देख रहा हूं। लेकिन यह इस तथ्य को नहीं बदलेगा कि मुझे जल्दी या बाद में अभ्यास में राज्य ट्रांसफार्मर का उपयोग करना सीखना होगा;) – nietaki
मुझे अभी एहसास हुआ कि मैंने पहले से ही आपके उत्तरों में से एक को पढ़ा है जिसमें 'ट्रैवर्स' और 'ट्रैवर्स एस' का विस्तृत विवरण है। और इसके लिए भी आपकी प्रशंसा की। मैं कल्पना नहीं कर सकता कि यह मेरे साथ कैसे नहीं रहा ... – nietaki
अगर किसी को स्कालज़ की बजाय बिल्लियों के साथ कुछ करने की ज़रूरत है, तो ध्यान दें कि कोई 'ट्रैवर्स' नहीं है लेकिन मेरे पास 'traverseU' का उपयोग करके इसका एक उदाहरण है : https://github.com/benhutchison/gesture/blob/master/core/jvm/src/test/scala/gesture/GestureProcessorSpec.scala#L34 –