Math.Sqrt () एक स्थिर फ़ंक्शन क्यों है?


31

स्थैतिक और उदाहरण के तरीकों के बारे में चर्चा में, मुझे हमेशा लगता है, कि Sqrt()स्थैतिक विधि के बजाय संख्या प्रकारों की एक आवृत्ति विधि होनी चाहिए। ऐसा क्यों है? यह स्पष्ट रूप से एक मूल्य पर काम करता है।

 // looks wrong to me
 var y = Math.Sqrt(x);
 // looks better to me
 var y = x.Sqrt();

मूल्य प्रकार स्पष्ट रूप से उदाहरण के तरीके हो सकते हैं, जैसा कि कई भाषाओं में, उदाहरण विधि है ToString()

टिप्पणियों से कुछ सवालों के जवाब देने के लिए: 1.Sqrt()कानूनी क्यों नहीं होना चाहिए ? 1.ToString()है।

कुछ भाषाएँ मान प्रकारों पर विधियों की अनुमति नहीं देती हैं, लेकिन कुछ भाषाएँ कर सकती हैं। मैं जावा, ईसीएमएस्क्रिप्ट, सी # और पायथन ( __str__(self)परिभाषित के साथ ) सहित, इन के बारे में बात कर रहा हूं । वही अन्य कार्यों के लिए लागू होता है ceil(), floor()आदि।


18
आप इसमें किस भाषा का प्रस्ताव कर रहे हैं? 1.sqrt()मान्य होगा ?

20
कई भाषाओं में (जैसे जावा) युगल आदिम हैं (प्रदर्शन कारणों से) इसलिए उनके पास तरीके नहीं हैं
रिचर्ड टिंगल

45
इसलिए संख्यात्मक प्रकार को हर संभव गणितीय कार्य के साथ फूला होना चाहिए जो उन पर लागू किया जा सकता है?
डी स्टेनली

19
FWIW मुझे लगता Sqrt(x)है कि अगर मैं इसके साथ ठीक कर रहा हूँ कुछ भाषाओं में वर्ग के साथ समारोह prepending का मतलब है की तुलना में बहुत अधिक प्राकृतिक लग x.Sqrt()रहा है। यदि यह थे एक उदाहरण विधि तो x.GetSqrt()संकेत मिलता है कि यह है अधिक उचित होगा लौटने एक मूल्य के बजाय संशोधित उदाहरण।
डी स्टेनली

23
यह प्रश्न अपने वर्तमान स्वरूप में भाषा अज्ञेय नहीं हो सकता। यही समस्या की जड़ है।
उदयकाल

जवाबों:


20

यह पूरी तरह से भाषा डिजाइन का विकल्प है। यह आदिम प्रकारों के अंतर्निहित कार्यान्वयन और उसके कारण प्रदर्शन के विचारों पर भी निर्भर करता है।

.NET में सिर्फ एक स्टैटिक Math.Sqrtतरीका है जो a पर काम करता है doubleऔर एक रिटर्न देता हैdouble । जो कुछ भी आप इसे पास करते हैं, उसे कास्ट या प्रमोट किया जाना चाहिए double

double sqrt2 = Math.Sqrt(2d);

दूसरी ओर, आपके पास जंग है जो इन कार्यों को प्रकारों पर कार्य के रूप में उजागर करता है :

let sqrt2 = 2.0f32.sqrt();
let higher = 2.0f32.max(3.0f32);

लेकिन रस्ट में सार्वभौमिक फ़ंक्शन कॉल सिंटैक्स (किसी ने पहले उल्लेख किया है) है, इसलिए आप जो चाहें उसे चुन सकते हैं।

let sqrt2 = f32::sqrt(2.0f32);
let higher = f32::max(2.0f32, 3.0f32);

1
यह ध्यान देने योग्य है कि .NET में आप एक्सटेंशन विधियों को लिख सकते हैं, इसलिए यदि आप वास्तव में इस कार्यान्वयन को देखना चाहते हैं x.Sqrt(), तो यह किया जा सकता है। public static class DoubleExtensions { public static double Sqrt( this double self) { return Math.Sqrt(self); } }
Zachary डॉव

1
इसके अलावा C # 6 में यह सिर्फ Sqrt(x) msdn.microsoft.com/en-us/library/sf0df423.aspx हो सकता है ।
डेन

65

मान लीजिए हम एक नई भाषा डिज़ाइन कर रहे हैं और हम Sqrtएक उदाहरण विधि बनना चाहते हैं । इसलिए हम doubleकक्षा को देखते हैं और डिजाइन करना शुरू करते हैं। यह स्पष्ट रूप से कोई इनपुट नहीं है (उदाहरण के अलावा) और रिटर्न ए double। हम कोड लिखते हैं और परीक्षण करते हैं। पूर्णता।

लेकिन पूर्णांक का वर्गमूल लेना भी मान्य है, और हम हर किसी को वर्गमूल लेने के लिए केवल एक डबल में बदलने के लिए मजबूर नहीं करना चाहते हैं। इसलिए हम intडिजाइन करना शुरू करते हैं। यह क्या लौटाता है? हम एक वापसी कर सकते हैं intऔर इसे केवल सही वर्गों के लिए काम कर सकते हैं , या परिणाम को निकटतम कर सकते हैं int(अब के लिए उचित गोलाई विधि के बारे में बहस को अनदेखा कर सकते हैं)। लेकिन अगर कोई गैर-पूर्णांक परिणाम चाहता है तो क्या होगा? क्या हमारे पास दो विधियाँ होनी चाहिए - एक जो रिटर्न करती है intऔर एक जो रिटर्न करती है double(जो नाम बदले बिना कुछ भाषाओं में संभव नहीं है)। इसलिए हम तय करते हैं कि इसे वापस लौटना चाहिए double। अब हम लागू करते हैं। लेकिन कार्यान्वयन उसी के समान है जिसका हमने उपयोग किया थाdouble। क्या हम कॉपी-पेस्ट करते हैं? क्या हम इंस्टेंस को एक कास्ट करते हैं doubleऔर उस इंस्टेंस मेथड को कॉल करते हैं ? एक पुस्तकालय पद्धति में तर्क क्यों नहीं रखा गया जो दोनों वर्गों से पहुँचा जा सकता है। हम लायब्रेरी Mathऔर फ़ंक्शन को कॉल करेंगे Math.Sqrt

Math.Sqrtएक स्थिर कार्य क्यों है ?:

  • क्योंकि अंतर्निहित संख्यात्मक प्रकार की परवाह किए बिना कार्यान्वयन समान है
  • क्योंकि यह एक विशेष उदाहरण को प्रभावित नहीं करता है (यह एक मूल्य में लेता है और एक परिणाम देता है)
  • क्योंकि संख्यात्मक प्रकार उस कार्यक्षमता पर निर्भर नहीं करते हैं , इसलिए यह एक अलग वर्ग में होना समझ में आता है

हमने अन्य तर्कों को भी संबोधित नहीं किया है:

  • क्या इसे नाम दिया जाना चाहिए GetSqrtक्योंकि यह उदाहरण को संशोधित करने के बजाय एक नया मूल्य देता है?
  • किस बारे में Square? Abs? Trunc? Log10? Ln? Power? Factorial? Sin? Cos? ArcTan?

6
1.sqrt()बनाम की खुशियों का उल्लेख नहीं करना 1.1.sqrt()(गड्स, जो बदसूरत दिखते हैं) क्या उनके पास एक सामान्य आधार वर्ग है? इसकी sqrt()विधि का अनुबंध क्या है ?

5
@MichaelT अच्छा उदाहरण है। यह समझने के लिए कि मुझे किस चीज़ का 1.1.Sqrtप्रतिनिधित्व करने में चार रीड्स लगे । चतुर।
डी स्टैनले

17
मैं इस जवाब से वास्तव में स्पष्ट नहीं हूं कि स्थैतिक वर्ग आपके मुख्य कारण के साथ कैसे मदद करता है। यदि आपके मठ वर्ग पर डबल Sqrt (int) और डबल Sqrt (डबल) हैं, तो आपके पास दो विकल्प हैं: int को एक डबल में बदलें, फिर डबल संस्करण में कॉल करें, या उपयुक्त परिवर्तनों के साथ विधि को कॉपी और पेस्ट करें (यदि कोई हो )। लेकिन वे बिल्कुल वही विकल्प हैं जो आपने उदाहरण संस्करण के लिए वर्णित किए हैं। आपके अन्य तर्क (विशेषकर आपके तीसरे बुलेट बिंदु) मैं अधिक से सहमत हूं।
बेन आरोनसन

14
-1 यह जवाब बेतुका है, इसमें से किसी का भी स्थैतिक होने से क्या लेना-देना है? आप उन्हीं प्रश्नों के उत्तर तय करने जा रहे हैं जो (और "[एक स्थैतिक कार्य के साथ] कार्यान्वयन समान है" गलत है, या कम से कम कोई और अधिक सच है कि उदाहरण के तरीकों के लिए यह होगा ..)
ब्लूराजा - डैनी पफ्लुगुएफ्ट

20
"अंतर्निहित संख्यात्मक प्रकार की परवाह किए बिना कार्यान्वयन समान है" पूरी तरह से बकवास है। स्क्वायर रूट फ़ंक्शन के कार्यान्वयन को उस प्रकार के आधार पर महत्वपूर्ण रूप से भिन्न करने की आवश्यकता होती है, जिसके साथ वे काम कर रहे हैं, जो बहुत ही अक्षम नहीं है।
आर ..

25

गणितीय संचालन अक्सर बहुत ही संवेदनशील होते हैं। इसलिए, हम स्थिर तरीकों का उपयोग करना चाहते हैं जो संकलन समय पर पूरी तरह से हल हो सकते हैं (और अनुकूलन, या इनलेट)। कुछ भाषाएं वैधानिक रूप से प्रेषण विधियों को निर्दिष्ट करने के लिए कोई तंत्र प्रदान नहीं करती हैं। इसके अलावा, कई भाषाओं के ऑब्जेक्ट मॉडल में पर्याप्त मेमोरी ओवरहेड है जो "आदिम" प्रकारों के लिए अस्वीकार्य है double

कुछ भाषाएँ हमें ऐसे कार्यों को परिभाषित करने की अनुमति देती हैं जो विधि आह्वान वाक्यविन्यास का उपयोग करते हैं, लेकिन वास्तव में सांख्यिकीय रूप से भेजे जाते हैं। C # 3.0 या बाद में विस्तार विधियाँ एक उदाहरण हैं। गैर-आभासी तरीके (जैसे C ++ में विधियों के लिए डिफ़ॉल्ट) एक और मामला है, हालांकि C ++ आदिम प्रकारों पर विधियों का समर्थन नहीं करता है। आप निश्चित रूप से C ++ में अपना स्वयं का रैपर वर्ग बना सकते हैं, जो बिना किसी रनटाइम ओवरहेड के विभिन्न प्रकारों के साथ एक आदिम प्रकार को सजाता है। हालाँकि, आपको मानों को मैन्युअल रूप से उस आवरण प्रकार में बदलना होगा।

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


रास्ते से बाहर तकनीकी विचारों के साथ, हम विचार कर सकते हैं कि क्या इस तरह की विधि-आधारित गणित इंटरफ़ेस एक अच्छा इंटरफ़ेस होगा। दो मुद्दे उठते हैं:

  • गणितीय संकेतन ऑपरेटरों और कार्यों पर आधारित है, विधियों पर नहीं। एक अभिव्यक्ति जैसे कि 42.sqrtकई उपयोगकर्ताओं की तुलना में बहुत अधिक विदेशी दिखाई देगी sqrt(42)। एक गणित-भारी उपयोगकर्ता के रूप में, मैं नहीं बल्कि डॉट-मेथड-कॉल सिंटैक्स पर अपने स्वयं के ऑपरेटर बनाने की क्षमता पसंद करूँगा।
  • सिंगल रिस्पांसिबिलिटी प्रिंसिपल हमें उन ऑपरेशंस की संख्या को सीमित करने के लिए प्रोत्साहित करता है जो एक प्रकार के आवश्यक ऑपरेशंस का हिस्सा हैं। गुणन के साथ तुलना में, आपको स्क्वायर रूट की आवश्यकता शायद ही कभी होती है। अपनी भाषा विशेष रूप से सांख्यिकीय anlysis के लिए है, तो अधिक पुरातन उपलब्ध कराने के हैं (जैसे कि आपरेशन के रूप में mean, median, variance, std, normalizeसंख्यात्मक सूची, या संख्या के लिए गामा फ़ंक्शन पर) उपयोगी हो सकता है। एक सामान्य-उद्देश्य वाली भाषा के लिए, यह केवल इंटरफ़ेस को मापता है। गैर-आवश्यक संचालन को एक अलग नामस्थान पर ले जाने से उपयोगकर्ताओं के बहुमत के लिए प्रकार अधिक सुलभ हो जाता है।

पायथन भारी संख्या में क्रंचिंग के लिए इस्तेमाल की जाने वाली हर वस्तु-वस्तु का एक अच्छा उदाहरण है। NumPy स्केलर में वास्तव में दर्जनों और दर्जनों तरीके हैं, लेकिन sqrt अभी भी उनमें से एक नहीं है। उनमें से ज्यादातर चीजें ऐसी हैं transposeऔर meanवे केवल NumPy सरणियों के साथ एक समान इंटरफ़ेस प्रदान करने के लिए हैं, जो वास्तविक वर्कहॉर्स डेटा संरचना हैं।
user2357112

7
@ user2357112: बात यह है, NumPy खुद कुछ Pyonon गोंद के साथ C और Cython के मिश्रण में लिखा गया है। अन्यथा यह कभी भी उतना तेज नहीं हो सकता था।
केविन

1
मुझे लगता है कि यह जवाब कुछ हद तक वास्तविक दुनिया के समझौते के बहुत करीब है जो डिजाइन के वर्षों में पहुंच गया है। अन्य समाचारों में, क्या यह वास्तव में .Net में "हैलो वर्ल्ड" करने में सक्षम होने के लिए मायने रखता है। मोम () के रूप में LINQ एक्सटेंशन हमें अनुमति देता है और Intellisense में बहुत दृश्य बनाता है। बोनस अंक: परिणाम क्या है? बोनस बोनस, यूनिकोड में परिणाम क्या है ...?
एंडीज स्मिथ

15

मैं इस तथ्य से प्रेरित होऊंगा कि एक टन का विशेष उद्देश्य गणित कार्य है, और उन कार्यों के सभी (या एक यादृच्छिक सबसेट) के साथ हर गणित प्रकार को आबाद करने के बजाय आप उन्हें एक उपयोगिता वर्ग में डालते हैं। अन्यथा, आप या तो अपने ऑटो-कम्प्लीट टूलटिप को प्रदूषित करेंगे, या आप लोगों को हमेशा दो स्थानों पर देखने के लिए बाध्य करेंगे। (क्या sinइसका सदस्य होना पर्याप्त है Double, या यह Mathइनब्रेड्स जैसे htanऔर के साथ कक्षा में है exp1p?)

एक और व्यावहारिक कारण यह है कि यह पता चलता है कि संख्यात्मक तरीकों को लागू करने के लिए अलग-अलग तरीके हो सकते हैं, अलग-अलग प्रदर्शन और सटीक व्यापार-नापसंद होते हैं। जावा में है Math, और यह भी है StrictMath


मुझे आशा है कि भाषा डिजाइनर ऑटो-टूल टूलिप के बारे में परवाह नहीं करेंगे। साथ ही, क्या होता है Math.<^space>? वह ऑटो-पूर्ण टूलटिप भी प्रदूषित होगा। इसके विपरीत, मुझे लगता है कि आपका दूसरा पैराग्राफ शायद यहां बेहतर उत्तरों में से एक है।
Qix

@Qix वे करते हैं। हालाँकि, अन्य लोग इसे "एक इंटरफ़ेस फूला हुआ" कह सकते हैं।
Aleksandr Dubinsky

6

आपने सही ढंग से देखा है कि यहाँ खेलने में एक उत्सुक समरूपता है।

चाहे मैं कहूं sqrt(n)या n.sqrt()वास्तव में कोई फर्क नहीं पड़ता है, वे दोनों एक ही बात को व्यक्त करते हैं और जो आप पसंद करते हैं वह किसी भी चीज की तुलना में व्यक्तिगत स्वाद का मामला है।

यही कारण है कि दो वाक्यविन्यासों को विनिमेय बनाने के लिए कुछ भाषा डिजाइनरों से एक मजबूत तर्क है। डी प्रोग्रामिंग भाषा पहले से ही यूनिफॉर्म फंक्शन कॉल सिंटैक्स नामक एक सुविधा के तहत इसकी अनुमति देती है । C ++ में मानकीकरण के लिए एक समान विशेषता भी प्रस्तावित की गई है । जैसा कि मार्क अमेरी टिप्पणियों में बताते हैं , पायथन इसकी भी अनुमति देता है।

यह समस्याओं के बिना नहीं है। एक मौलिक वाक्यविन्यास परिवर्तन का परिचय इस तरह मौजूदा कोड के लिए व्यापक परिणाम है और निश्चित रूप से डेवलपर्स के बीच विवादास्पद चर्चा का विषय है, जो दो वाक्यविन्यासों को अलग-अलग चीजों का वर्णन करने के बारे में सोचने के लिए दशकों से प्रशिक्षित हैं।

मुझे लगता है कि केवल समय ही बताएगा कि दोनों का एकीकरण लंबे समय में संभव है, लेकिन यह निश्चित रूप से एक दिलचस्प विचार है।


अजगर पहले से ही इन दोनों सिंटैक्स का समर्थन करता है। प्रत्येक गैर-स्थैतिक विधि selfइसके पहले पैरामीटर के रूप में लेती है , और जब आप विधि को संपत्ति के गुण के रूप में कहते हैं, तो वर्ग की संपत्ति के बजाय, उदाहरण पहले तर्क के रूप में निहित हो जाता है। इसलिए मैं लिख सकता हूं "foo".startswith("f")या str.startswith("foo", "f"), और मैं लिख सकता हूं my_list.append(x)या list.append(my_list, x)
मार्क एमी

@ मकर्मी अच्छी बात। यह काफी कठोर नहीं है क्योंकि डी या सी ++ प्रस्ताव क्या करते हैं, लेकिन यह सामान्य विचार पर फिट बैठता है। इशारा करने के लिए धन्यवाद!
ComicSansMS

3

डी स्टैनले के उत्तर के अलावा आपको बहुरूपता के बारे में सोचना होगा। Math.Sqrt जैसे तरीके हमेशा एक ही इनपुट के लिए एक ही मान वापस करना चाहिए। विधि को स्थिर बनाना इस बिंदु को स्पष्ट करने का एक अच्छा तरीका है, क्योंकि स्थैतिक विधियाँ अधिक उपयोगी नहीं हैं।

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


2

खैर, जावा में हर बुनियादी प्रकार के लिए एक आवरण है।
और बुनियादी प्रकार वर्ग-प्रकार नहीं हैं, और कोई सदस्य-कार्य नहीं हैं।

तो, आपके पास निम्नलिखित विकल्प हैं:

  1. उन सभी हेल्पर-फ़ंक्शंस को एक प्रो-फ़ॉर्म-क्लास की तरह इकट्ठा करें Math
  2. इसी आवरण पर एक स्थिर कार्य करें।
  3. इसी आवरण पर एक सदस्य-कार्य करें।
  4. जावा के नियम बदलें।

चलो विकल्प 4 को नियम से बाहर करें, क्योंकि ... जावा जावा है, और इस तरह से इसे पसंद करने के लिए प्रोफेसरों का पालन करता है।

अब, हम भी विकल्प 3 से इनकार कर सकते हैं क्योंकि, जबकि वस्तुओं का आवंटन काफी सस्ता है, यह मुक्त नहीं है, और कर कि बार-बार करता है जोड़ें।

नीचे दो, एक को मारने के लिए अभी भी: विकल्प 2 भी एक बुरा विचार है, क्योंकि इसका मतलब है कि प्रत्येक फ़ंक्शन को हर प्रकार के लिए लागू किया जाना चाहिए , कोई भी अंतराल को भरने के लिए व्यापक रूपांतरण पर भरोसा नहीं कर सकता है, या असंगति वास्तव में चोट लगी होगी।
और एक नज़र डालते हुए java.lang.Math, बहुत सारे अंतराल हैं, विशेष रूप से intसंबंधित से छोटे प्रकार के लिए double

तो, अंत में स्पष्ट विजेता एक विकल्प है, उपयोगिता-फ़ंक्शन-क्लास में उन सभी को एक जगह इकट्ठा करना।

विकल्प 4 पर लौटते हुए, उस दिशा में कुछ वास्तव में बहुत बाद में हुआ: आप कंपाइलर से किसी भी वर्ग के सभी स्थैतिक सदस्यों पर विचार करने के लिए कह सकते हैं, जो अब काफी लंबे समय से नामों को हल कर रहे हैं। import static someclass.*;

एक तरफ, अन्य भाषाओं में वह समस्या नहीं है, क्योंकि या तो उनके पास नि: शुल्क कार्यों के खिलाफ कोई पूर्वाग्रह नहीं है (वैकल्पिक रूप से नामस्थान का उपयोग करके) या बहुत कम छोटे प्रकार।


1
Math.min()सभी आवरण प्रकारों पर भिन्नताओं को लागू करने की खुशियों पर विचार करें ।

मुझे # 4 अटूट मिला। Math.sqrt()जावा के बाकी हिस्सों के रूप में एक ही समय में बनाया गया था, इसलिए जब sqrt () को लगाने का निर्णय लिया गया था, तो Mathजावा उपयोगकर्ताओं की कोई ऐतिहासिक जड़ता नहीं थी जो "उस तरह से पसंद करते हैं"। जबकि वहाँ के साथ कोई समस्या नहीं है sqrt(), अतिभारित व्यवहार Math.round()है अत्याचार। प्रकार के मूल्यों के साथ सदस्य वाक्यविन्यास का उपयोग करने में सक्षम होने floatऔर doubleउस समस्या से बचा होगा।
सुपरकैट

2

एक बिंदु जो मुझे स्पष्ट रूप से उल्लिखित नहीं दिखता है (हालांकि इसके लिए सभी दृष्टिकोण) यह है कि वर्गमूल को "व्युत्पन्न" ऑपरेशन के रूप में सोचा जा सकता है: यदि कार्यान्वयन हमारे लिए प्रदान नहीं करता है, तो हम अपना खुद का लिख ​​सकते हैं।

चूंकि प्रश्न भाषा-डिजाइन के साथ टैग किया गया है, इसलिए हम कुछ भाषा-अज्ञेय वर्णन पर विचार कर सकते हैं। हालाँकि कई भाषाओं में अलग-अलग दर्शन होते हैं, फिर भी प्रतिमानों में बहुत आम है कि आक्रमणकारियों को संरक्षित करने के लिए एनकैप्सुलेशन का उपयोग किया जाए; यानी ऐसा मान रखने से बचने के लिए जो इसका प्रकार नहीं सुझाएगा।

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

कुछ भाषाएं इसे कक्षाओं और निजी तरीकों से लागू कर सकती हैं:

class Int {
    public Int add(Int x) {
      // Do something with the bits
    }
    private List<Boolean> getBits() {
      // ...
    }
}

मॉड्यूल सिस्टम के साथ कुछ:

signature INT = sig
  type int
  val add : int -> int -> int
end

structure Word : INT = struct
  datatype int  = (* ... *)
  fun add x y   = (* Do something with the bits *)
  fun getBits x = (* ... *)
end

शाब्दिक गुंजाइश के साथ कुछ:

(defun getAdder ()
   (let ((getBits (lambda (x) ; ...
         (add     (lambda (x y) ; Do something with the bits
     'add))

और इसी तरह। हालांकि, वर्गमूल को लागू करने के लिए इनमें से किसी भी तंत्र की आवश्यकता नहीं है: यह एक संख्यात्मक प्रकार के सार्वजनिक इंटरफ़ेस का उपयोग करके लागू किया जा सकता है , और इसलिए इसे एन्कैप्सुलेटेड कार्यान्वयन विवरण तक पहुंच की आवश्यकता नहीं है।

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


कुछ भी नहीं एक भाषा को एक स्थिर विधि को या तो सदस्य सिंटैक्स (सी # या vb.net एक्सटेंशन विधियों के साथ) का उपयोग करने से रोकने की अनुमति होगी या सदस्य अनुक्रम के एक भिन्नता के साथ (मैं एक डबल-डॉट सिंटैक्स देखना पसंद करता था, इसलिए के रूप में केवल प्राथमिक तर्क के लिए उपयुक्त थे कि कार्यों को सूचीबद्ध करने में सक्षम होने के Intellisense फायदे की अनुमति देने के लिए, लेकिन वास्तविक सदस्य ऑपरेटरों के साथ अस्पष्टता से बचें)।
सुपरकैट

-2

Java और C # ToString ऑब्जेक्ट की एक विधि है, जो क्लास पदानुक्रम की जड़ है, इसलिए प्रत्येक ऑब्जेक्ट ToString पद्धति को लागू करेगा। एक इंटेग्रेटाइप के लिए यह स्वाभाविक है कि ToString का कार्यान्वयन इस तरह से काम करेगा।

तो आप तर्क गलत है। ToString को लागू करने का कारण मान प्रकार यह नहीं है कि कुछ लोग जैसे थे: अरे चलो मान प्रकार के लिए एक ToString विधि है। यह इसलिए है क्योंकि ToString पहले से ही है और यह आउटपुट के लिए "सबसे स्वाभाविक" चीज है।


1
बेशक यह एक निर्णय करने के लिए निर्णय है, यानी objectएक है ToString()विधि। यह आपके शब्दों में है "कुछ लोग इस तरह थे: अरे चलो मान के लिए एक ToString विधि है"।
रेजिड्यूमन

-3

String.substring के विपरीत, Number.sqrt वास्तव में संख्या की विशेषता नहीं है, बल्कि आपके नंबर के आधार पर एक नया परिणाम है। मुझे लगता है कि एक स्क्वेरिंग फ़ंक्शन में आपका नंबर पास करना अधिक सहज है।

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


3
काउंटर उदाहरण: BigInteger.pow ()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.