2012-05-04 16 views
17

मुझे पता है कि हास्केल केस्काला हास्केल के 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 

काम करेगा, लेकिन मुझे यकीन है कि यह बात है नहीं कर रहा हूँ और, अगर यह सही है, तो मुझे यकीन है कि वहाँ होना चाहिए हूँ ऐसा करने का एक बेहतर तरीका है।

ओह, और यदि आप इस प्रश्न का उत्तर दे सकते हैं, तो क्या आप एक और जवाब दे सकते हैं: काले जादू की तरह महसूस करने से पहले मुझे मोनाड्स में कब तक देखना होगा? :-)

धन्यवाद! टोड

+7

यदि आप चर का उपयोग करने के लिए प्लानिग नहीं हैं, तो आप अंडरस्कोर के साथ अपना नाम बदल सकते हैं: '_ <- setInput str' – incrop

+0

मुझे लगता है कि यह करने के लिए सबसे अधिक स्केल जैसा तरीका है। – TOB

+0

यह सुनिश्चित नहीं है कि यह वास्तव में संभव होगा, लेकिन इन बयानों को शरीर के लिए ले जाकर यह अधिक प्राकृतिक लग सकता है, जहां आप वास्तव में प्रक्रियात्मक शैली जा सकते हैं। – dividebyzero

उत्तर

24

हां, यह अनुवाद मान्य है।

do { x <- m; n }m >>= \x -> n के बराबर है, और do { m; n }m >> n के बराबर है। चूंकि m >> n को m >>= \_ -> n के रूप में परिभाषित किया गया है (जहां _ का अर्थ है "इस मान को किसी भी चीज़ से बाध्य न करें"), यह वास्तव में एक वैध अनुवाद है; do { m; n }do { _ <- m; n }, या do { unusedVariable <- m; n } जैसा ही है।

do ब्लॉक में परिवर्तनीय बाध्यकारी के बिना एक बयान केवल परिणाम की उपेक्षा करता है, आमतौर पर क्योंकि बोलने का कोई सार्थक परिणाम नहीं होता है। उदाहरण के लिए, putStrLn "Hello, world!" के परिणाम के साथ कुछ भी दिलचस्प नहीं है, इसलिए आप इसके परिणाम को एक चर के साथ बाध्य नहीं करेंगे।

(मोनैड काले जादू होने के लिए, आपके पास सबसे अच्छा अहसास है कि वे वास्तव में जटिल नहीं हैं; उनमें गहरा अर्थ खोजने की कोशिश करना आम तौर पर सीखने का एक उत्पादक तरीका नहीं है। वे ' विशेष रूप से सामान्य होने वाली गणनाओं को लिखने के लिए बस एक इंटरफ़ेस है। मैं Typeclassopedia को हास्केल के अमूर्त टाइपक्लास पर ठोस समझ प्राप्त करने के लिए पढ़ने की सलाह देता हूं, हालांकि आपको इससे अधिक प्राप्त करने के लिए सामान्य हास्केल परिचय पढ़ना होगा।)

+1

कोई विचार क्यों स्कैला '>>' के लिए चीनी प्रदान नहीं करता है? –

+0

मुझे लगता है क्योंकि स्कैला के रूप में एक monad समझ प्रदान करता है। शायद गणना के क्रम को बनाए रखा नहीं है। संपादित करें: ऐसा लगता है कि ऐसा नहीं लगता है। –

+1

मोनाड पर जवाब वास्तव में अच्छा है। यह सिर्फ एक प्रोग्रामिंग पैटर्न है। कुछ भी नहीं "काला जादू"। –

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