नोड.जेएस दस्तावेज़ (और अच्छा slide deck) के माध्यम से पढ़ने के बाद, मुझे लगता है कि यहां अन्य उत्तरों के बारे में बात याद आ रही है: नोड.जेएस इस विचार पर आधारित है कि लेखन कार्यक्रमों की शैली जहां हम उन्हें उम्मीद करते हैं I/O पर अवरुद्ध करने के लिए गलत है, और इसके बजाय हमें I/O (जैसे डेटाबेस पढ़ना, या सॉकेट पढ़ना) शुरू करना चाहिए और अनुरोध के साथ I/O के परिणाम को संभालने के लिए एक फ़ंक्शन के साथ पास करना चाहिए। नोड के
db.query("select..", function (result) {
// use result
});
लेखकों (:
तो बजाय ऐसा करते हैं:
var result = db.query("select.."); // blocking
// use result
Node.js ऐसा करने का विचार पर आधारित है।जेएस) बताते हैं कि प्रोग्रामिंग का यह तरीका कई प्रणालियों में बहुत अजीब है क्योंकि भाषाओं में बंद या अज्ञात कार्य नहीं होते हैं और पुस्तकालय मुख्य रूप से I/O को अवरुद्ध कर रहे हैं। हालांकि, जावास्क्रिप्ट पूर्व की आपूर्ति करता है (और प्रोग्रामर का उपयोग इस बात के लिए किया जाता है कि जेएस का उपयोग ब्राउज़र में किसी तरह की घटना में कैसे किया जाता है), और नोड.जेएस बाद में भर जाता है: बिना किसी अवरुद्ध कॉल के एक पूरी तरह से संचालित आई/ओ लाइब्रेरी बिलकुल।
यह कार्यात्मक प्रोग्रामिंग से कैसे संबंधित है? सभी कार्यात्मक प्रोग्रामिंग भाषाएं बंद करने के लिए पर्याप्त शक्तिशाली बनाती हैं जो नोड.जेएस जावास्क्रिप्ट के साथ करने की कोशिश कर रही है। अधिकांश कोड को और भी आसान बनाते हैं, क्योंकि पासिंग क्लोजर आमतौर पर भाषा के लिए मौलिक होता है।
मोनाड्स का उपयोग करके हास्केल के लिए, इस तरह की चीज निर्माण करना बहुत आसान हो सकता है। उदाहरण के लिए:
doQuery :: DBConnection -> IO()
doQuery db = do
rows <- query db "select..."
doSomething rows
doSomethingElse rows
ये बहुत अनुक्रमिक, कोड की अनिवार्यता लाइनों वास्तव में IO
इकाई के नियंत्रण में बंद का एक क्रम है। यह है के रूप में यदि जावास्क्रिप्ट में आप लिखा था:
db.query("select...", function (rows) {
doSomething(rows, function() {
doSomethingElse(rows, function() { /* done */ })
})
})
संक्षेप में, जब एक कार्यात्मक भाषा में monadic कोड लिखने, आप पहले से ही यह रूप में लिख रहे हैं Node.js लेखक हमें लिखना चाहते हैं: जहां हर कदम अनुक्रमिक गणना के पहले को बंद करने के रूप में पारित किया गया है। हालांकि, देखो कि कोड हास्केल में कितना अच्छा दिखता है!
forkQuery :: DBConnection -> IO ThreadId
forkQuery db = forkIO $ do
rows <- query db "select..."
doSomething rows
doSomethingElse rows
महंगी प्रक्रिया कांटा आप के लिए इस्तेमाल कर रहे हैं, या यहां तक कि ओएस की प्रक्रिया के साथ कि forkIO
भ्रमित न हों:
इसके अलावा, आप आसानी से समवर्ती हास्केल इस गैर अवरुद्ध आपरेशन आसानी से प्राप्त करने के लिए सुविधाओं का उपयोग कर सकते धागे। यह मूल रूप से निष्पादन का एक हल्का वजन धागा है जो नोड.जेएस उपयोग कर रहा है (केवल कुछ हद तक समृद्ध अर्थशास्त्र के साथ)। आपके पास नोड की तरह 1,000 के दशक हो सकते हैं। जेएस का लक्ष्य है।
तो, संक्षेप में - मुझे लगता है कि नोड.जेएस जावास्क्रिप्ट में मौजूद एक सुविधा पर निर्माण कर रहा है, लेकिन यह कार्यात्मक भाषाओं में अधिक प्राकृतिक है। इसके अलावा, मुझे लगता है कि नोड.जेएस में मौजूद सभी तत्व पहले से ही हास्केल और उसके पैकेज में मौजूद हैं, और फिर कुछ। मेरे लिए, मैं सिर्फ हास्केल का उपयोग करता हूं!
अच्छा, काफी ईमानदार होने के लिए, कार्यात्मक प्रोग्रामिंग एक शुद्ध भाषा का संकेत नहीं देती है। हास्केल बस ऐसा करने का विकल्प चुनता है। – codebliss
ध्यान दें कि मैंने कभी दावा नहीं किया है। प्रोग्रामिंग शैली, अपने आप में, जैसा कि मैंने इसे परिभाषित किया है। इसके बारे में थोड़ा विवाद। इस बारे में एक सतत बहस है कि किसी को "कार्यात्मक प्रोग्रामिंग भाषा" कहने की अनुमति दी जानी चाहिए - कोई भी भाषा जो शैली की अनुमति देती है, कोई भी भाषा जहां मुख्य फोकस उस शैली का समर्थन कर रहा है, या केवल ऐसी भाषाएं जो किसी अन्य शैली का समर्थन नहीं करती हैं। यह एक अलग बहस है। Haskell उदाहरण के लिए – harms