मुझे पता है कि हास्केल केस्काला हास्केल के do-अंकन के बराबर (एक बार फिर)
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
विशेष रूप से monads साथ,
for {
x <- List(1, 2, 3)
y <- List(7, 8, 9)
z = x + y
} yield z
के रूप में स्काला में व्यक्त किया जा सकता लेकिन, हास्केल अक्सर अंदर बयान है do
ब्लॉक जो <-
या =
से संबंधित नहीं है। उदाहरण के लिए, यहां पांडोक से कुछ कोड है जो एक स्ट्रिंग से कुछ पार्स करने के लिए पारसी का उपयोग करता है।
-- | Parse contents of 'str' using 'parser' and return result.
parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a
parseFromString parser str = do
oldPos <- getPosition
oldInput <- getInput
setInput str
result <- parser
setInput oldInput
setPosition oldPos
return result
आप देख सकते हैं, यह स्थिति और इनपुट की बचत होती है, स्ट्रिंग पर पार्सर चलाता है, और उसके बाद परिणाम लौटने से पहले इनपुट और स्थिति पुनर्स्थापित करता है।
मैं अपने जीवन के लिए setInput str
, setInput oldInput
, और setPosition oldPos
को स्कैला में अनुवाद करने का तरीका समझ सकता हूं। मुझे लगता है कि अगर मैं में बकवास चर डाल तो मैं <-
इस्तेमाल कर सकते हैं जैसे
for {
oldPos <- getPosition
oldInput <- getInput
whyAmIHere <- setInput str
result <- parser
...
} yield result
काम करेगा, लेकिन मुझे यकीन है कि यह बात है नहीं कर रहा हूँ और, अगर यह सही है, तो मुझे यकीन है कि वहाँ होना चाहिए हूँ ऐसा करने का एक बेहतर तरीका है।
ओह, और यदि आप इस प्रश्न का उत्तर दे सकते हैं, तो क्या आप एक और जवाब दे सकते हैं: काले जादू की तरह महसूस करने से पहले मुझे मोनाड्स में कब तक देखना होगा? :-)
धन्यवाद! टोड
यदि आप चर का उपयोग करने के लिए प्लानिग नहीं हैं, तो आप अंडरस्कोर के साथ अपना नाम बदल सकते हैं: '_ <- setInput str' – incrop
मुझे लगता है कि यह करने के लिए सबसे अधिक स्केल जैसा तरीका है। – TOB
यह सुनिश्चित नहीं है कि यह वास्तव में संभव होगा, लेकिन इन बयानों को शरीर के लिए ले जाकर यह अधिक प्राकृतिक लग सकता है, जहां आप वास्तव में प्रक्रियात्मक शैली जा सकते हैं। – dividebyzero