"बिंदु मुक्त" शैली (कार्यात्मक प्रोग्रामिंग में) क्या है?


101

एक वाक्यांश जो मैंने हाल ही में देखा है वह "बिंदु मुक्त" शैली की अवधारणा है ...

पहले, यह सवाल था , और यह भी

फिर, मैंने यहां पाया कि वे "एक और विषय है जिस पर चर्चा करने लायक हो सकता है, वह है लेखकों का बिंदु मुक्त शैली के प्रति अरुचि।"

"बिंदु मुक्त" शैली क्या है? क्या कोई संक्षिप्त स्पष्टीकरण दे सकता है? क्या यह "स्वचालित" करी के साथ कुछ करना है?

अपने स्तर का अंदाजा लगाने के लिए - मैं खुद स्कीम सिखा रहा हूँ, और एक साधारण स्कीम दुभाषिया लिखा है ... मैं समझता हूँ कि "इम्प्रूव्ड" करी क्या है, लेकिन मैं किसी हास्केल या एमएल को नहीं जानता।


3
बस एक ध्यान दें: यह देखने के लिए क्यों यह कहा जाता है pointfree यात्रा Pointfree / लेकिन pointfree अधिक अंक है! हास्केलविक पर।
बजे पेट्र पुडलक

जवाबों:


66

बस को देखने के विकिपीडिया लेख अपनी परिभाषा पाने के लिए:

टैसिट प्रोग्रामिंग (पॉइंट-फ्री प्रोग्रामिंग) एक प्रोग्रामिंग प्रतिमान है जिसमें एक फ़ंक्शन परिभाषा में चर के बजाय कॉम्बिनेटर और फ़ंक्शन रचना [...] का उपयोग करके इसके तर्कों के बारे में जानकारी शामिल नहीं है।

हास्केल उदाहरण:

परम्परागत (आप तर्क स्पष्ट रूप से निर्दिष्ट करें):

sum (x:xs) = x + (sum xs)
sum [] = 0

बिंदु-मुक्त ( sumकोई स्पष्ट तर्क नहीं है - यह केवल +0 से शुरू होने के साथ गुना है ):

 sum = foldr (+) 0

या इससे भी सरल: इसके बजाय g(x) = f(x), आप बस लिख सकते हैं g = f

तो हाँ: यह करीने से संबंधित है (या फ़ंक्शन संरचना जैसे संचालन)।


8
हाँ! मैंने देखा! तो आप नए कार्यों का निर्माण हमेशा तर्कों की घोषणा करने के बजाय अन्य कार्यों को मिलाकर करते हैं ... बहुत ही सुरुचिपूर्ण!
पॉल हॉलिंगवर्थ

22
जब मैं प्रोग्रामिंग कर रहा होता हूं, तो मैं वास्तव में चर / तर्कों के नए नामों के साथ आना पसंद करता हूं। यह एक बड़ा कारण है कि मुझे बिंदु-मुक्त शैली पसंद है!
मार्टिअन

2
यह किस तरीके से करी से संबंधित है?
बहुआयामी

1
@kaleidic: क्योंकि परिवर्तनशील नामों के बिना, आपको आंशिक रूप से लागू किए गए कार्यों की रचना करने की आवश्यकता है। इसे हम कर्रिंग कहते हैं (या, और अधिक सटीक रूप से, जो कि करी के माध्यम से संभव बनाया गया है)
डारियो

1
क्या आपको sum (x:xs) ...इसके बजाय मतलब नहीं है sum sum (x:xs) ...?
एहतेश चौधरी

33

बिंदु मुक्त शैली का मतलब है कि परिभाषित किए जा रहे फ़ंक्शन के तर्कों का स्पष्ट रूप से उल्लेख नहीं किया गया है, कि फ़ंक्शन फ़ंक्शन संरचना के माध्यम से परिभाषित किया गया है।

यदि आपके पास दो कार्य हैं, जैसे

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1

और यदि आप इन दो कार्यों को एक साथ जोड़ना चाहते हैं जो गणना करता है x*x+1, तो आप इसे इस तरह "बिंदु-पूर्ण" परिभाषित कर सकते हैं:

f :: a -> a
f x = inc (square x)

बिंदु मुक्त विकल्प तर्क के बारे में बात नहीं करेगा x:

f :: a -> a
f = inc . square

22
स्टुपिडली, हास्केल में, 'पॉइंट-फ़्री' तरीका आमतौर पर ऐसा होता है जो पॉइंटियर (अधिक अवधि) दिखता है। यह झुंझलाहट एक उत्कृष्ट महामारी बनाता है। (इस पर रियल वर्ल्ड हास्केल की पुस्तक।)
डैन

3
@ दान की टिप्पणी के बारे में, पॉइंटफ्री हास्केल्विकी पेज स्पष्टीकरण देता है कि इसे पॉइंटफ्री क्यों कहा जाता है ।
विंसेंट सवार्ड

2
@Dan: मुझे नहीं लगता कि यह बेवकूफी है, क्योंकि हास्केल बिंदु "उस सर्कल ऑपरेटर" के रूप में है (हालांकि इसे अधिक पसंद करना चाहिए)। लेकिन भ्रमित करना, यह है, खासकर जब आप कार्यात्मक प्रोग्रामिंग भाषाओं में नए हैं; हैस्केल पर हर इंट्रो पुस्तक को बिंदु-मुक्त-शैली की व्याख्या करनी चाहिए।
सेबस्टियन मच

12

एक जावास्क्रिप्ट नमूना:

//not pointfree cause we receive args
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'

संदर्भ


5

बिंदु मुक्त शैली का मतलब है कि कोड स्पष्ट रूप से यह तर्क का उल्लेख नहीं करता है, भले ही वे मौजूद हों और उनका उपयोग किया जा रहा हो।

हास्केल में काम करने के तरीके के कारण यह काम करता है।

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

myTake = take

एक फ़ंक्शन देता है जो एक तर्क लेता है, इसलिए तर्क को स्पष्ट रूप से टाइप करने का कोई कारण नहीं है जब तक कि आप बस चाहते हैं।


1
कभी-कभी, यह हास्केल 98 में काम नहीं करता है, जैसा कि अंदर है myShow = showहास्केल विकी
एहतेश चौधरी

-1

यहाँ किसी भी अन्य पुस्तकालय के बिना टाइपस्क्रिप्ट में एक उदाहरण है:

interface Transaction {
  amount: number;
}

class Test {
  public getPositiveNumbers(transactions: Transaction[]) {
    return transactions.filter(this.isPositive);

    //return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
  }

  public getBigNumbers(transactions: Transaction[]) {
    // point-free
    return transactions.filter(this.moreThan(10));

    // not point-free
    // return transactions.filter((transaction: any) => transaction.amount > 10);
  }

  private isPositive(transaction: Transaction) {
    return transactions.amount > 0;
  }

  private moreThan(amount: number) {
    return (transaction: Transaction) => {
      return transactions.amount > amount;
    }
  }
}

आप देख सकते हैं कि बिंदु-मुक्त शैली अधिक "धाराप्रवाह" है और पढ़ने में आसान है।


यह बिंदु-मुक्त शैली नहीं है, यह केवल एक मेमने और एक नामित फ़ंक्शन के बीच अंतर है।
क्रालिक

@kralyk मुझे लगता है कि आप इस बिंदु से चूक गए हैं, this.moreThan(10)एक नामित फ़ंक्शन नहीं है, यह एक क्यूरेड फ़ंक्शन है और साथ ही एक फ़ंक्शन है जो अंतर्निहित रूप से (इस प्रकार बिंदु मुक्त) transactionइसके इनपुट के रूप में लेगा ।
अज।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.