2009-07-26 9 views
7

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

आपके उत्तरों के लिए धन्यवाद।

Btw: अगर आप सोच रहे हैं, तो मैं क्या पूछना चाहते: "वहाँ एक जोरदार टाइप किया प्रोग्रामिंग भाषा जो आप नए ऑपरेटरों निर्धारित कर सकते हैं"

+0

परिभाषित करें "ऑपरेटर"। – Svante

+2

'ऑपरेटर' एक सुंदर अच्छी तरह से परिभाषित शब्द है। –

उत्तर

19

Like EFraim said, हास्केल इस सुंदर आसान बनाता है:

 
% ghci 
ghci> let a *-* b = (a*a) - (b*b) 
ghci> :type (*-*) 
(*-*) :: (Num a) => a -> a -> a 
ghci> 4 *-* 3 
7 
ghci> 1.2 *-* 0.9 
0.6299999999999999 
ghci> (*-*) 5 3 
16 
ghci> :{ 
   let gcd a b | a > b  = gcd (a - b) b 
      | b > a  = gcd a (b - a) 
      | otherwise = a 
  :} 
ghci> :type gcd 
gcd :: (Ord a, Num a) => a -> a -> a 
ghci> gcd 3 6 
3 
ghci> gcd 12 11 
1 
ghci> 18 `gcd` 12 
6 

आप नए इन्फ़िक्स ऑपरेटरों (केवल प्रतीक) एक इन्फ़िक्स सिंटेक्स के उपयोग को परिभाषित कर सकते हैं। इसके बाद आप उन्हें का उपयोग इन्फिक्स ऑपरेटरों के रूप में कर सकते हैं, या उन्हें सामान्य कार्य के रूप में उपयोग करने के लिए माता-पिता में संलग्न कर सकते हैं।

आप बैकटिक्स में संलग्न करके ऑपरेटरों के रूप में सामान्य कार्यों (अक्षरों, संख्याओं, अंडरस्कोर और सिंगल-कोट्स) का भी उपयोग कर सकते हैं।

+0

क्या यह आपको प्राथमिकता के साथ टिंकर करने देता है? – skaffman

+2

यूप! 'Infixr' और' infixl' का उपयोग करें: http://www.zvon.org/other/haskell/Outputsyntax/fixityQdeclaration_reference.html – rampion

9

शायद हास्केल? आपको मनमानी इन्फिक्स ऑपरेटरों को परिभाषित करने की अनुमति देता है।

10

ठीक है, आप कई भाषाओं में ऑपरेटरों के एक निश्चित सेट को फिर से परिभाषित कर सकते हैं, जैसे C++ या C#। अन्य, जैसे F# या Scala आपको नए ऑपरेटरों को भी परिभाषित करने की अनुमति देता है (यहां तक ​​कि इन्फिक्स वाले) जो गणित-वाई सामान के लिए भी अच्छे हो सकते हैं।

8

टेड Neward स्काला पर लेख जावा डेवलपर्स के उद्देश्य से की एक श्रृंखला लिखा और वे कैसे स्काला में एक गणितीय डोमेन भाषा (जो, संयोग से, एक स्थिर टाइप भाषा है)

लिखने के लिए प्रदर्शन करके इसे बंद समाप्त हो गया Part 1

Part 2

Part 3

+1

मुझे लगता है कि स्कैला का नकारात्मक पक्ष प्राथमिकता और सहयोगीता को फिर से परिभाषित करने में असमर्थता होगी। ये तय किए गए हैं (विधि नाम के पहले और अंतिम चरित्र द्वारा परिभाषित)। –

+0

हाँ, यह थोड़ा गंध करता है। – skaffman

3

C++ में आप ऑपरेटरों कि अन्य वर्गों पर काम परिभाषित कर सकते हैं, लेकिन मैं जैसे अन्य आदिम प्रकार में नहीं सोचता इनट्स क्योंकि उनके पास इंस्टेंस विधियां नहीं हो सकती हैं। आप या तो सी ++ में अपना खुद का नंबर क्लास बना सकते हैं और + * आदि

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

शुभकामनाएं!

2

एडीए इन्फ़िक्स ऑपरेटरों ओवरराइड करने के लिए समर्थन हासिल है: यहाँ reference manual chapter है।

दुर्भाग्य से आप अपने स्वयं के नए ऑपरेटर नहीं बना सकते हैं, ऐसा लगता है कि आप केवल मौजूदा लोगों को ओवरराइड कर सकते हैं।

type wobble is new integer range 23..89; 

function "+" (A, B: wobble) return wobble is 
begin 
    ... 
end "+"; 

एडीए, एक बेहद लोकप्रिय भाषा नहीं है यह कहा जा करने के लिए है, लेकिन जहाँ तक मजबूत टाइपिंग चला जाता है, तो आप ज्यादा मजबूत नहीं मिल सकता है।

संपादित करें:

एक और भाषा है जो अभी तक का उल्लेख नहीं किया गया है D है। यह एक दृढ़ता से टाइप की गई भाषा भी है, और operator overloading का समर्थन करता है। फिर, यह उपयोगकर्ता द्वारा परिभाषित इंफिक्स ऑपरेटरों का समर्थन नहीं करता है।

से http://www.digitalmars.com/d/1.0/rationale.html

क्यों उपयोगकर्ता definable ऑपरेटरों की अनुमति नहीं

?

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

2

यद्यपि प्रक्रिया आप एक लिस्प संयोजन में तर्क करने के लिए आवेदन के रूप में एक "ऑपरेटर," कहा जाता है तो हाँ, आप नए ऑपरेटरों को परिभाषित कर सकते जब तक शाम होने आते हैं।

1

मुझे लगता है कि आपको शायद इस बारे में गहराई से सोचना चाहिए कि आप इस सुविधा का उपयोग क्यों करना चाहते हैं। ऐसा लगता है कि एक भाषा चुनते समय बहुत अधिक महत्वपूर्ण विचार हैं।

मैं केवल इस संदर्भ में "ऑपरेटर" शब्द के लिए एक संभावित अर्थ के बारे में सोच सकता हूं, जो फ़ंक्शन कॉल के लिए सिंटैक्टिक चीनी है, उदाहरण के लिए foo + bar को फ़ंक्शन +(a, b) पर कॉल के रूप में अनुवादित किया जाएगा।

यह कभी-कभी उपयोगी होता है, लेकिन अक्सर नहीं। मैं बहुत कम उदाहरणों के बारे में सोच सकता हूं जहां मैंने ऑपरेटर को अधिभारित/परिभाषित किया है।

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, हास्केल आपको नए इन्फिक्स ऑपरेटरों को परिभाषित करने की अनुमति देता है। हालांकि, आलसी मूल्यांकन के साथ एक पूरी तरह कार्यात्मक भाषा एक मुंह से थोड़ा सा हो सकता है। यदि आप पहली बार एक कार्यात्मक भाषा पर प्रयास करना चाहते हैं, तो शायद मैं Haskell पर SML की अनुशंसा करता हूं। प्रकार प्रणाली थोड़ा सा सरल है, आप साइड इफेक्ट्स का उपयोग कर सकते हैं और यह आलसी नहीं है।

एफ # भी बहुत रोचक है और इसमें units of measure भी शामिल है, जो AFAIK उस भाषा के लिए अद्वितीय है। यदि आपको सुविधा की आवश्यकता है तो यह अमूल्य हो सकता है।

मेरे सिर के ऊपर से मैं इंफिक्स ऑपरेटरों के साथ किसी भी स्थिर रूप से टाइप की गई अनिवार्य भाषाओं के बारे में नहीं सोच सकता, लेकिन आप गणित प्रोग्रामिंग के लिए एक कार्यात्मक भाषा का उपयोग करना चाह सकते हैं, क्योंकि यह एक कार्यात्मक के बारे में तथ्यों को साबित करना बहुत आसान है कार्यक्रम।

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

+0

सी ++ बूस्ट लाइब्रेरी "इकाइयां" माप की F # इकाइयों के समान संकलन-समय आयामी विश्लेषण प्रदान करती है। –

2

ओकंपल और f# दोनों में इंफिक्स ऑपरेटर हैं। उनके पास वर्णों का एक विशेष सेट होता है जिन्हें उनके वाक्यविन्यास में अनुमति दी जाती है, लेकिन दोनों का उपयोग किसी भी फ़ंक्शन इंफिक्स का उपयोग करने के लिए अन्य प्रतीकों में हेरफेर करने के लिए किया जा सकता है (ocaml discussion देखें)।

0

आप वास्तव में ऐसा कर सकते हैं जो आपको ऑपरेटर ओवरलोडिंग के माध्यम से सी # के साथ चाहिए।

उदाहरण:

public static Complex operator -(Complex c) 
{ 
    Complex temp = new Complex(); 
    temp.x = -c.x; 
    temp.y = -c.y; 
    return temp; 
} 

+0

हाँ यह सही है लेकिन आप नए ऑपरेटरों को परिभाषित नहीं कर सकते हैं, ताकि आप +, -, *, /, तुलना ऑपरेटर और कुछ और तक सीमित हो। लेकिन क्या होगा यदि आपके पास दो सेट हैं और आप दोनों का संघ प्राप्त करना चाहते हैं? क्या आपको वास्तव में एक स्थिर फ़ंक्शन set.union (setA, setB) जाना और परिभाषित करना होगा? – niklasfi

1

आप मजबूत टाइपिंग से क्या मतलब है? क्या आपका मतलब स्थिर टाइपिंग है (जहां सब कुछ एक प्रकार है जो संकलन समय पर जाना जाता है, और रूपांतरण प्रतिबंधित हैं) या मजबूत टाइपिंग (सबकुछ एक प्रकार का रन रन पर जाना जाता है, और रूपांतरण प्रतिबंधित हैं)?

मैं आम लिस्प के साथ जाऊंगा। इसमें वास्तव में ऑपरेटरों नहीं होते हैं (उदाहरण के लिए, ए और बी (+ a b) जोड़ना), बल्कि फ़ंक्शंस, जिन्हें स्वतंत्र रूप से परिभाषित किया जा सकता है। इसमें मजबूत टाइपिंग है कि प्रत्येक ऑब्जेक्ट का एक निश्चित प्रकार होता है, भले ही इसे संकलित समय पर नहीं जाना जा सके, और रूपांतरण प्रतिबंधित हैं। यह खोजी प्रोग्रामिंग के लिए वास्तव में एक महान भाषा है, और ऐसा लगता है कि आप यही करेंगे।

1

Ruby does.

require 'rubygems' 
require 'superators' 

class Array 
    superator "<---" do |operand| 
    self << operand.reverse 
    end 
end 

["jay"] <--- "spillihp" 
संबंधित मुद्दे

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