2012-02-05 15 views
29

कई हास्केल ट्यूटोरियल मैंने प्रोग्राम को कैसे व्यवस्थित किया जाए, इस बारे में बहुत कम कवरेज के साथ लगभग पूरी तरह से वाक्यविन्यास पर ध्यान केंद्रित किया है।हास्केल प्रोग्राम का मूल संरचना

उदाहरण के लिए ...

यहाँ एक सी के एक नंगे हड्डियों रूपरेखा है ++ आवेदन:

#include <iostream> 
using namespace std; 

int addition (int a, int b) 
{ 
    int r; 
    r=a+b; 
    return (r); 
} 

int main() 
{ 
    int z; 
    z = addition (5,3); 
    cout << "The result is " << z; 
    return 0; 
} 

जब मैं पहली बार सी ++ सीखने शुरू कर दिया, इस तरह के उदाहरण मुझे बेहद कैसे अलग-अलग इकट्ठा करने के लिए सीखने में मदद की कामकाजी कार्यक्रमों में टुकड़े। हो सकता है कि मैं गलत जगहों पर देख रहा हूं, लेकिन मैं ऐसे किसी भी उदाहरण नहीं ढूंढ पा रहा हूं जो हास्केल के लिए सीधे और सरल हैं।

मुझे पहले से ही हास्केल वाक्यविन्यास का बहुत कुछ पता है। मैं पुनरावर्ती सूची समझ लिख सकता हूं, और तारों, पूर्णांक, और वज़ू को सूचियों में हेरफेर कर सकता हूं।

संक्षेप में: मैं सिर्फ यह जानना चाहता हूं कि हास्केल में दो सबराउटिन और वेरिएबल पास कैसा दिखता है। यदि मैं हास्केल प्रोग्राम को कैसे व्यवस्थित करना है, इस बारे में कुछ बुनियादी समझ प्राप्त कर सकता हूं, तो अंत में मैं कुछ सिंटैक्स डाल सकता हूं जिसे मैंने कुछ उपयोग के लिए सीखा है।

+2

मैं http://www.haskell.org/haskellwiki/Haskell_in_5_steps जैसे स्थानों पर शुरू करूंगा, मैं क्लोजर सीख रहा हूं। हालांकि, मेरे पास O'Reilly Haskell पुस्तक है, और यह पुस्तक - http://www.nostarch.com/lyah.htm - बहुत अच्छी समीक्षा मिल रही है। – octopusgrabbus

+3

हालांकि यह एक वैध सवाल है, मुझे यह सुझाव देने की अनुमति दें कि आप हास्केल से थोड़ा गलत हैं। हास्केल जितना संभव हो सके शुद्ध कार्यों पर जोर देता है, और अधिकांश हास्केल कार्यान्वयन एक आरईपीएल (रीड-इवल-प्रिंट लूप) प्रदान करते हैं जहां आप परिभाषित कार्यों के साथ खेल सकते हैं। मैं अत्यधिक अनुशंसा करता हूं कि छोटे कार्यक्रम बनाने के बजाय जो स्टडआउट पर प्रिंट करें, केवल कार्यों को लिखें और ghci में उनके साथ खेलें। मुझे लगता है कि आपको यह पता चल जाएगा कि यह हास्केल सीखने के लिए अधिक लचीला और मजेदार है। –

+0

@ डैनबर्टन मैंने शायद पिछले महीने सिंटैक्स पर पढ़ा है, और ghci में कार्यों और सूची समझ के साथ खेल रहा है। मैं अब एक कार्यक्रम बनाने के लिए तैयार हूँ। (: डी आप सही हैं कि मैं हास्केल को गलत कर रहा हूं। मैं प्रक्रियात्मक प्रोग्रामिंग सिद्धांतों को एक कार्यात्मक प्रोग्रामिंग भाषा में लागू करने की कोशिश कर रहा हूं। मैं अभी भी अपने सिर को लपेटने की कोशिश कर रहा हूं कि कार्यों में एक गुच्छा कैसे करें जो एक बार दौड़ने से रोक सकता है और रोक सकता है। मैं पढ़ना जारी रखूंगा। –

उत्तर

32

एक हास्केल प्रोग्राम की संरचना आश्चर्यजनक रूप से सरल है। आपके पास main फ़ंक्शन है जो आईओ करता है, और यह इसके बारे में है। तो मूल बातें:

module Main where 

addition a b = a + b 

main :: IO() 
main = do let z = addition 5 3 
      putStrLn $ "The result is: " ++ show z 

अब आप यह एक सरल कार्यक्रम में की तरह कुछ का उपयोग कर संकलन कर सकते हैं:

ghc --make Main.hs -o program 

और यह एक निष्पादन योग्य प्रोग्राम कहा जाता है का उत्पादन करना चाहिए।

सामान्य रूप से, कार्यक्रमों को आईओ से निपटने वाले कोड के अलग-अलग हिस्सों के साथ वास्तविक गणना के साथ अधिकतर शुद्ध कार्यों के रूप में संरचित किया जाता है। (इसमें निश्चित रूप से अपवाद हैं, लेकिन जितना संभव हो उतना शुद्ध कोड लिखने का सामान्य विचार काफी सार्वभौमिक है।)

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

IO पर आपके कोड का हिस्सा main में अंकित है। ज्यादातर मामलों में, सभी आपका आईओ मुख्य माध्यम से जा रहा है; भले ही आप आईओ कार्यों को अलग से लिखते हैं और उन्हें नाम देते हैं, फिर भी उन्हें main से शुरू किया जाएगा।

हास्केल में एक "फ़ंक्शन समूह" को "मॉड्यूल" कहा जाता है। आप कई मॉड्यूल कर सकते हैं, प्रत्येक अपनी फाइल में:

module Blarg (exportedFunction) where 

helper a b = ... -- this will *not* be exported 
exportedFunction a b = helper a b -- this *will* be exported 

केवल कोष्ठक में पहचानकर्ता निर्यात किए जाएंगे; बाकी छिपे हुए हैं। यदि आप कोष्ठक शामिल नहीं करते हैं, तो सबकुछ डिफ़ॉल्ट रूप से निर्यात किया जाएगा।

इस फ़ाइल को Blarg.hs के रूप में सहेजें।अब आप Main में आयात कर सकते हैं:

import Blarg 

समूह के कार्यों के लिए एक और उपयोगी तरीका where है:

complicatedFunction a b c = helper 0 
    where helper count = ... 

इस तरह helper केवल complicatedFunction के लिए दायरे में है और यह भी a, b और c की पहुंच है complicatedFunction से।

+0

आपके जवाब के लिए धन्यवाद। मैं मुख्य से परिचित हूं, लेकिन मैं अन्य सबराउटिन कैसे बना सकता हूं, और क्या उन सबराउटिन संवाद करते हैं और एक-दूसरे के बीच चर पार करते हैं? –

+3

आपके पास वास्तव में "subroutines" नहीं है, आपके पास * फ़ंक्शन * हैं। चूंकि कोई उत्परिवर्तन नहीं है, इसलिए आप उन कार्यों के तर्क के रूप में मूल्यों को पास करते हैं (जैसे कि मेरे उदाहरण में 'अतिरिक्त 5 3')। –

+0

दाएं। मेरा कहना था, आप अन्य "फ़ंक्शन समूह" कैसे बनाते हैं? असल में, मैं सबकुछ मुख्य रूप से नहीं डालने की कोशिश कर रहा हूं। –

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