2014-07-06 7 views
6

इस question का उत्तर देते हुए, मुझे एहसास हुआ कि आपको को ऑब्जेक्ट को कार्य करने की अनुमति देता है और समानांतर फ़ंक्शन परिभाषाओं का उपयोग करने के लिए इसका उपयोग करता है।फ़ंक्शन की समानांतर घोषणा एक अच्छा विचार है?

असल में, मान लें कि मैं इस

a = (1+) 
b = (2+) 
c = (3+) 
d = (4+) 
e = (5+) 

क्या DRYest जिस तरह से यह लिखने के लिए होगा की तरह कुछ करना चाहते हैं करते हैं? मेरा मतलब है, सभी पैटर्न समान होने के बाद: फ़ंक्शन का नाम अनुमानित नहीं किया जा सकता है और न ही जोड़ने की राशि, लेकिन मुझे हर बार + लिखने से बचने में सक्षम होना चाहिए (पाठ्यक्रम के टेम्पलेट हास्केल का उपयोग किए बिना)।

असल में, मैं map या कुछ समान उपयोग करने में सक्षम होना चाहता हूं और ऐसा लगता है कि map बस काम करता है!

[a,b,c,d,e] = map (+) [1..5] 

और voila!

कि बहुत कम और शायद अधिक अर्थपूर्ण है, और यह काम करता है:

> a 10 
11 
> b 10 
12 
etc ... 

तो मेरे सवाल है, यह एक अच्छा पैटर्न (स्थिति उस तरह का में) का उपयोग करने के लिए है और यदि नहीं है, जो ड्रॉ रहे हैं बैक (मुझे पता है कि में समतुल्य अनुभव खरीदते हैं रूबी एक दुःस्वप्न है, लेकिन कारण हास्केल के साथ लागू नहीं होते हैं)?

अद्यतन

मैं समझता हूँ पठनीयता इस तरह के कोड का व्यक्तिपरक है और के रूप में राय-आधारित देखा जा सकता है। हालांकि, ऐसा करने के कुछ उद्देश्य कारण नहीं हो सकते हैं। उदाहरण के लिए, रूबी (कम से कम 1.8), define_method का उपयोग करके परिभाषित विधियां अधिकांश आईडीई और टैग निर्माता के लिए अदृश्य हैं। इसके अलावा, आप डीबगर इत्यादि का उपयोग करके उनमें कदम नहीं उठा सकते ... जो उन्हें अभ्यास में असुविधाजनक बनाते हैं। मैं में इसी तरह के कारण के लिए पूछ रहा हूँ हास्केल

+7

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

उत्तर

8

एक साथ नकारात्मक पक्ष

[a,b,c,d,e] = map (+) [1..5] 

है कि यह आवश्यकता समझी जाने वाली पैटर्न मिलान है - मैच स्थिर मान्य होने के लिए गारंटी नहीं है। जाहिर है इस मामले में कोई समस्या नहीं है, लेकिन एक और सूक्ष्म उदाहरण में जहां शायद [1..5] को अन्यत्र परिभाषित किया गया था, यह देखना मुश्किल हो सकता है।

मुझे इस विशेष मामले में इस शैली के लिए कोई विशेष लाभ भी नहीं दिख रहा है, हालांकि मुझे एहसास है कि यह एक संक्षिप्त उदाहरण है।

(xs, ys) = unzip [(1, 'a'), (2, 'b')] 
+1

गैर-संपूर्ण गड़बड़ को आंशिक रूप से हल किया जा सकता है 'ए: बी: सी: डी: ई: _ = मानचित्र (+) [1 ..] ' –

6

यह homogeneous tuples के लिए पैकेज (जो मैं कर रहा हूँ का उपयोग कर पूरा किया जा सकता:

एक मामले में जहां एक ही पंक्ति में एक से अधिक मान निर्धारित करने सार्थक है अगर आप एक समारोह है कि एक टपल देता है, उदाहरण के लिए है के लेखक):

import Data.Tuple.Homogenous 

... 
    let Tuple4 (a, b, c, d) = fmap (+) $ Tuple4 (1, 2, 3, 4) 
    in ... 

गैर-संपूर्ण पैटर्न मिलान का उपयोग किए बिना।

इसके अलावा एक और समान पैकेज tup-functor है।

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