कुछ किताब मैं निम्नलिखित कोड है से`do` और` where` मिश्रण कैसे करें?
mutableUpdateIO :: Int -> IO (MV.MVector RealWorld Int)
mutableUpdateIO n = do
mvec <- GM.new (n + 1)
go n mvec
where
go 0 v = return v
go n v = (MV.write v n 0) >> go (n - 1) v
mutableUpdateST :: Int -> V.Vector Int
mutableUpdateST n =
runST $ do
mvec <- GM.new (n + 1)
go n mvec
where
go 0 v = V.freeze v
go n v = (MV.write v n 0) >> go (n - 1) v
hindent
तरह इंडेंट उन्हें टुकड़े। अब मैं सभी ब्रेसिज़ और सेमीकॉलन पेश करना चाहता हूं, इसलिए व्हाइटस्पेस अब और प्रासंगिक नहीं है। सिर्फ इसलिए कि मैं उत्सुक हूँ।
दूसरे उदाहरण से पता चलता है, कि where
पूरे runST $ do ...
अभिव्यक्ति के अंतर्गत आता है, लेकिन पहले उदाहरण पता चलता है, कि जहां किसी भी तरह go n mvec
बयान का एक हिस्सा है। Haskell Report Chapter 2.7 में पढ़ना मैं
mutableUpdateIO :: Int -> IO (MV.MVector RealWorld Int)
mutableUpdateIO n = do {
mvec <- GM.new (n + 1);
go n mvec;
where {
go 0 v = return v;
go n v = (MV.write v n 0) >> go (n - 1) v;
} ; }
की तरह पहले उदाहरण में ब्रेसिज़ और अर्धविराम पेश करने की कोशिश की लेकिन मैं एक पार्स त्रुटि मिलती है। ऐसा क्यों है?
लेआउट hindent
क्यों पहला उदाहरण mutableUpdateIO
वैध हास्केल का उत्पादन करता है? क्या मेरे ऊपर की कोशिश में ब्रेसिज़ और सेमीकॉलन पेश नहीं किए जाने चाहिए?
'जहां 'af'ik से अलग है। मुझे लगता है कि स्वचालित रूप से कार्यक्षेत्र कहां है। – Carcigenicate
से संबंधित: https://stackoverflow.com/questions/9721354/in-haskell-what-is-the-scope-of-a-where-clause-when-dealing-with-guards – Carcigenicate
'do ...' अभिव्यक्ति है। 'जहां अभिव्यक्तियों को कभी नहीं जोड़ा जाता है, केवल घोषणाओं के लिए। – melpomene