कार्यात्मक प्रोग्रामिंग के लिए तर्क [बंद]


10

मैं हाल ही में एफ # मनोरंजन के लिए सीख रहा हूं (मैं एक VB.NET/C# देव हूं), और मुझे वास्तव में कुछ पसंद है जो इसे पेश करना है। सैद्धांतिक रूप से वह है। लेकिन मुझे उन परिदृश्यों के बारे में सोचने में परेशानी हो रही है जहाँ मैं C # के बजाय F # में कोड चुनना चाहूँगा। कोई विचार?


2
F#पूरी तरह से कार्यात्मक प्रोग्रामिंग का प्रतिनिधि नहीं है। Clojureइसके बजाय कोशिश करें ।
नौकरी

1
मुझे F # का पता नहीं है, लेकिन मैं जब भी अपना दिमाग फूंकता हूं तो हास्केल का इस्तेमाल करता हूं। अब तक हर बार काम किया;)

1
infoq.com/pretations/Are-We-There-Yet-Rich-Hickey इस विषय पर एक बेहतरीन वीडियो है (OO बनाम कार्यात्मक)
mikera

एक गतिशील कार्यात्मक भाषा? आप जितने चाहें उतने हो सकते हैं। : पी
एरिक रेपेन

जवाबों:


14

शुद्ध कार्यात्मक प्रोग्रामिंग के लिए कुछ तर्क:

  • आज के मल्टी-कोर सिस्टम के लिए कार्यों को विभाजित करना आसान है
  • यह साबित करना आसान है कि आपका कार्यक्रम सही है
  • क्रियात्मक रचना अद्भुत, सुव्यवस्थित और शक्तिशाली हो सकती है

एक पूर्ण उपचार के लिए, देखें क्यों कार्यात्मक प्रोग्रामिंग मैटर्स और क्यों कार्यात्मक प्रोग्रामिंग मैटर्स मैटर्स


6

मुझे उन परिदृश्यों के बारे में सोचने में परेशानी हो रही है जहाँ मैं C # के बजाय F # में कोड चुनना चाहूंगा। कोई विचार?

से यहाँ :

अतुल्यकालिक सर्वर

  • एसिंक्रोनस IO के लिए अतुल्यकालिक वर्कफ़्लोज़।
  • थ्रेड-सुरक्षित संदेश पासिंग के लिए मेलबॉक्स प्रोसेसर।
  • सर्वर राज्य और संदेश कैटलॉग के लिए यूनियन प्रकार।
  • राज्य मशीनों के लिए पैटर्न मिलान और पूंछ पुनरावृत्ति।

मेटाप्रोग्रामिंग (उदाहरण के लिए पार्सिंग)

  • पार्सर जनरेटर जैसे fslex और fsyacc।
  • पार्सर कॉम्बिनेटर जैसे FParsec।
  • सुरुचिपूर्ण हाथ से लुढ़का पर्सर्स के लिए सक्रिय पैटर्न।
  • बीजीय डेटाटिप्स पार्स पेड़ों का प्रतिनिधित्व करने के लिए।
  • पेड़ों से छेड़छाड़ करने के लिए पैटर्न, जैसे अनुकूलन चरणों को लागू करें।
  • तेज कोड की रन-टाइम पीढ़ी के लिए प्रतिबिंब।

तकनीकी कंप्यूटिंग

  • सुरुचिपूर्ण और तेज़ एल्गोरिथम कोड के लिए उच्च-क्रम फ़ंक्शन।
  • बीजगणितीय डेटाटाइप्स और प्रतीकात्मक हेरफेर के लिए पैटर्न मिलान।
  • .NET पुस्तकालयों के धन के लिए अंतर।
  • एफ # इंटरैक्टिव का उपयोग करके अन्तरक्रियाशीलता।
  • डेटा की मालिश के लिए अभिकलन भाव।
  • सुधार की शुद्धता के लिए माप की इकाइयाँ।

जीयूआई अनुप्रयोगों

  • उपयोगकर्ता इंटरफ़ेस कोड और एप्लिकेशन लॉजिक कोड के बीच गुजरने वाले अतुल्यकालिक संदेश के रूप में मॉडल।
  • उच्च-क्रम फ़ंक्शंस आपको उपयोगकर्ता इंटरफ़ेस को घोषित रूप से परिभाषित करने देते हैं।

तर्क प्रोग्रामिंग

  • आसान बैकट्रैकिंग के लिए लगातार संग्रह।
  • विश्वसनीयता के लिए टेल कॉल।
  • आसान सामान्य प्रोग्रामिंग के लिए स्वचालित सामान्यीकरण।

परिक्षण

  • संवादात्मक रूप से इकाई परीक्षण चलाएं।
  • BDD का मतलब है दुभाषिया लिखना।
  • परीक्षण लिखने और परिणाम देखने के लिए अच्छी पटकथा भाषा।

प्रदर्शन

  • inline लागत-मुक्त उच्च-क्रम अमूर्तता के लिए।
  • तेज राज्य मशीनों के लिए टेल कॉल।
  • कम विलंबता के लिए विशुद्ध रूप से कार्यात्मक डेटा संरचनाएं।
  • अनुकूलित कोड की पीढ़ी के लिए मेटाप्रोग्रामिंग।

मैं यह स्वीकार करूंगा कि मुझे F # या C # नहीं पता है, लेकिन मैं F # में कुछ दिन बिताने का सुझाव दूंगा और यह सोचकर कि आप क्या सोचते हैं। REPL का उपयोग करते हुए मेरे मन में किसी भी भाषा में एक बड़ी जीत है जो इसका समर्थन करती है
Zachary K

5

यहाँ एक कार्यात्मक शैली प्रोग्रामिंग का उपयोग करें - अधिक-या-कम दैनिक आधार पर।

हम काफी बड़े डेटासेट के साथ कई सांख्यिकीय और एक्चुअरल चीजें करते हैं। डेटाबेस से प्राप्त डेटा है - अनिवार्य रूप से स्थिर, अपरिवर्तनीय वस्तुएं। तरीकों के साथ एक वर्ग बनाने का कोई कारण नहीं।

गणना के प्रत्येक चरण में कुछ अतिरिक्त विवरण शामिल होते हैं, लेकिन यह अनिवार्य रूप से वस्तु को उत्परिवर्तित नहीं करता है। पाइपलाइन के "अंत" पर हम वास्तव में एक रकम को कम करने के लिए रकम और गिनती और अन्य चीजों की गणना कर रहे हैं।

इसकी कल्पना करें।

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

गणना का प्रत्येक "चरण" एक कार्यात्मक प्रोग्रामिंग लूप है जो सरल रीड-गणना-उपज करता है और अन्य चीजों और परिणामों के एक समग्र ऑब्जेक्ट बनाता है।

(हम पायथन का उपयोग करते हैं, इसलिए जनरेटर कार्यों का उपयोग करते हुए कार्यात्मक प्रोग्रामिंग।)

स्टेटलेस, अपरिवर्तनीय वस्तुओं का उपयोग करना आसान है।


क्या पायथन में इस F # के बराबर है? criteria() |> some_query |> calculate |> enrich |> summarizeमुझे लगता है कि आगे पाइप ऑपरेटर स्पष्ट कोड के लिए नेतृत्व कर सकते हैं, लेकिन मैं पीछे हटना।
ChaosPandion

@ChaosPandion: पहला, जो वाक्य रचना मुझे भ्रमित करता है। लेकिन कुछ लोग इसे पसंद करने लगते हैं। वहाँ एक असंख्य अजगर पैकेज है। मुझे यकीन है कि आप एसओ पर उसके लिए खोज कर सकते हैं और एक उत्तर पा सकते हैं।
S.Lott

@ कॉच: ऐसा नहीं है कि मुझे पता है। आमतौर पर मैं mapएक ही प्रभाव प्राप्त करने के लिए रचना करता हूं ।
पॉल नाथन

4

तकनीकी रूप से, यह एक कार्यात्मक प्रोग्रामिंग की एक अद्वितीय संपत्ति नहीं है, और एफ # एक शुद्ध कार्यात्मक भाषा नहीं है। एफ #, एमएल वंशजों में से एक के रूप में, एक उत्कृष्ट पैटर्न मिलान और बीजीय डेटा प्रकार प्रदान करता है। इसलिए, किसी भी कार्य के लिए जिसे जटिल डेटा संरचनाओं की आवश्यकता होती है F # C # की तुलना में बहुत अधिक अभिव्यंजक और उपयोग करने में आसान है।

कल्पना करें कि C # और F # में एक कंपाइलर को लागू करना - एक अमूर्त वाक्यविन्यास ट्री का प्रतिनिधित्व करना और उस पर रूपांतरित करना बहुत सरल है यदि आपकी भाषा ADTs और एक पैटर्न मिलान प्रदान करती है।


2

बड़े पैमाने पर मल्टी-सिस्टम और बड़े पैमाने पर मल्टी-कोर समानता के मानचित्र-कम प्रकार के लिए आदर्श। बहुत अच्छा, यह देखते हुए कि आजकल प्रवेश स्तर के सर्वर 48 कोर (96 गिनती एचटी) के साथ आते हैं।


2

यदि आप पूरी तरह से कार्यात्मक कोशिश हास्केल चाहते हैं, तो एरलंग के पास इसके बारे में कुछ बहुत अच्छा सामान है।

साइमन पेटन-जोन्स ने हास्केल के बारे में कहा, वह एक ऐसा कार्यक्रम करना चाहते हैं जिसमें स्पष्ट रूप से बग न हों, बल्कि कोई स्पष्ट कीड़े न हों।

(मैं शायद बोली से थोड़ा दूर हो गया, लेकिन आपको यह विचार मिल गया)

साइड इफेक्ट्स को सीमित करके आप अपने कोड को सही साबित करना आसान बनाते हैं।


1

एक निश्चित लाभ यह है कि यह बहुत अधिक आसानी से समानांतर है।


2
आप शुद्धता के बारे में बात कर रहे हैं और एक स्पष्ट नुकसान यह है कि शुद्धता कार्यक्रमों को बहुत धीमा कर देती है। इसलिए समानांतर + शुद्ध होना अच्छी बात नहीं है।
जॉन हैरोप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.