मानक एमएल: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|General-purpose functional programming language}} {{Infobox programming language | name = Standard ML | logo = | paradigm = Programming paradigm|Multi-pa...")
 
No edit summary
 
(8 intermediate revisions by 4 users not shown)
Line 17: Line 17:
| website =
| website =
}}
}}
Standard ML (SML) एक [[सामान्य प्रयोजन प्रोग्रामिंग भाषा]] है | सामान्य-उद्देश्य, [[मॉड्यूलर प्रोग्रामिंग]], संकलन-समय [[प्रकार की जाँच]] और प्रकार के अनुमान के साथ [[कार्यात्मक प्रोग्रामिंग भाषा]]। यह [[संकलक]] लेखकों और प्रोग्रामिंग भाषा शोधकर्ताओं के साथ-साथ स्वचालित प्रमेय सिद्ध करने के विकास में लोकप्रिय है।
'''मानक एमएल (स्टैण्डर्ड एमएल-एसएमएल)''' सामान्य प्रयोजन, मॉड्यूलर, कार्यात्मक प्रोग्रामिंग भाषा है जिसमें संकलन-समय प्रकार की जाँच और प्रकार का अनुमान है। यह संकलक लेखकों और प्रोग्रामिंग भाषा शोधकर्ताओं के साथ-साथ प्रमेय सिद्ध करने वालों के विकास में लोकप्रिय है।
 
स्टैंडर्ड एमएल [[एमएल (प्रोग्रामिंग भाषा)]] की एक आधुनिक बोली है, [[संगणनीय कार्यों के लिए तर्क]] (LCF) प्रमेय-सिद्ध परियोजना में इस्तेमाल की जाने वाली भाषा। यह व्यापक रूप से उपयोग की जाने वाली भाषाओं के बीच विशिष्ट है, जिसमें इसका एक औपचारिक विनिर्देश है, जिसे 'मानक एमएल की परिभाषा' में [[टाइपिंग नियम]]ों और [[परिचालन शब्दार्थ]] के रूप में दिया गया है।<ref name="revision" />
 


मानक एमएल [[एमएल (प्रोग्रामिंग भाषा)|एमएल]] की एक आधुनिक बोली है, जो लॉजिक फॉर कंप्यूटेबल फंक्शंस (एलसीएफ) प्रमेय-सिद्ध परियोजना में उपयोग की जाने वाली भाषा है। यह व्यापक रूप से उपयोग की जाने वाली भाषाओं के बीच विशिष्ट है, इसमें एक औपचारिक विनिर्देश है, जिसे मानक की परिभाषा एमएल में [[टाइपिंग नियम|टाइपिंग]] नियमों और [[परिचालन शब्दार्थ]] के रूप में दिया गया है।<ref name="revision" />
== भाषा ==
== भाषा ==
{{multiple issues|section=y|
मानक एमएल एक कार्यात्मक प्रोग्रामिंग भाषा है जिसमें कुछ पदावनत विशेषताएं हैं। मानक एमएल में लिखे गए प्रोग्रामों में कथनों या आदेशों के विपरीत अभिव्यक्तियाँ होती हैं, हालाँकि टाइप यूनिट के कुछ भावों का मूल्यांकन केवल उनके दुष्प्रभावों के लिए किया जाता है।
{{How-to|section|date=November 2021}}
{{Unreferenced section|date=November 2021}}
}}
मानक एमएल कुछ अशुद्ध सुविधाओं के साथ एक कार्यात्मक [[प्रोग्रामिंग भाषा]] है। स्टैण्डर्ड ML में लिखे गए प्रोग्राम्स में स्टेटमेंट्स या कमांड्स के विपरीत [[अभिव्यक्ति (प्रोग्रामिंग)]] होते हैं, हालाँकि [[इकाई प्रकार]] के कुछ एक्सप्रेशन केवल उनके [[साइड इफेक्ट (कंप्यूटर विज्ञान)]] | साइड-इफेक्ट्स के लिए मूल्यांकन किए जाते हैं।


=== कार्य ===
=== कार्य ===
सभी कार्यात्मक भाषाओं की तरह, मानक एमएल की एक प्रमुख विशेषता फ़ंक्शन (प्रोग्रामिंग) है, जिसका उपयोग अमूर्तता के लिए किया जाता है। फैक्टोरियल फ़ंक्शन निम्नानुसार व्यक्त किया जा सकता है:
सभी कार्यात्मक भाषाओं की तरह, मानक एमएल की एक प्रमुख विशेषता कार्य है, जो अमूर्त के लिए उपयोग की जाती है। भाज्य फलन को इस प्रकार व्यक्त किया जा सकता है :<syntaxhighlight lang="sml">
 
fun factorial n =  
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
     if n = 0 then 1 else n * factorial (n - 1)
फन फैक्टोरियल एन =
</syntaxhighlight>
     अगर n = 0 तो 1 अन्य n * भाज्य (n - 1)
</वाक्यविन्यास हाइलाइट>


=== अनुमान टाइप करें ===
=== अनुमान टाइप करें ===
एक एसएमएल कंपाइलर को स्थिर प्रकार का अनुमान लगाना चाहिए {{code|lang=sml|val factorial : int -> int}} उपयोगकर्ता द्वारा आपूर्ति किए गए प्रकार के एनोटेशन के बिना। इसका निष्कर्ष निकालना होगा {{code|n}} केवल पूर्णांक अभिव्यक्तियों के साथ प्रयोग किया जाता है, और इसलिए स्वयं एक पूर्णांक होना चाहिए, और यह कि सभी टर्मिनल अभिव्यक्तियाँ पूर्णांक अभिव्यक्तियाँ हैं।
एक एसएमएल कंपाइलर को स्थिर प्रकार का अनुमान लगाना चाहिए {{code|lang=sml|val factorial : int -> int}}उपयोगकर्ता द्वारा आपूर्ति किए गए प्रकार के एनोटेशन के बिना। यह निष्कर्ष निकाला जाना चाहिए कि एन केवल पूर्णांक अभिव्यक्तियों के साथ प्रयोग किया जाता है, और इसलिए स्वयं एक पूर्णांक होना चाहिए और सभी टर्मिनल अभिव्यक्ति पूर्णांक अभिव्यक्तियां हैं।


=== घोषणात्मक परिभाषाएँ ===
=== घोषणात्मक परिभाषाएँ ===
एक ही फ़ंक्शन को क्लॉज़ल फ़ंक्शन परिभाषाओं के साथ व्यक्त किया जा सकता है, जहां if-then-else सशर्त को विशिष्ट मानों के लिए मूल्यांकन किए गए फैक्टोरियल फ़ंक्शन के टेम्प्लेट से बदल दिया जाता है:
एक ही फ़ंक्शन को क्लॉज़ल फ़ंक्शन परिभाषाओं के साथ व्यक्त किया जा सकता है, जहां if-then-else सशर्त को विशिष्ट मानों के लिए मूल्यांकन किए गए फैक्टोरियल फ़ंक्शन के टेम्प्लेट से बदल दिया जाता है:<syntaxhighlight lang="sml">
 
fun factorial 0 = 1
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
   | factorial n = n * factorial (n - 1)
फन फैक्टोरियल 0 = 1
</syntaxhighlight>
   | क्रमगुणित n = n * भाज्य (n - 1)
</वाक्यविन्यास हाइलाइट>


=== अनिवार्य परिभाषाएं ===
=== अनिवार्य परिभाषाएं ===
या पुनरावृत्त:
<syntaxhighlight lang="sml">
 
fun factorial n = let val i = ref n and acc = ref 1 in
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
     while !i > 0 do (acc := !acc * !i; i := !i - 1); !acc
फन फैक्टोरियल एन = वैल आई = रेफ एन और एसीसी = रेफ 1 इन
end
     जबकि !i > 0 do (acc := !acc * !i; i := !i - 1); ! एसीसी
</syntaxhighlight>
अंत
</वाक्यविन्यास हाइलाइट>


=== लैम्ब्डा कार्य ===
=== लैम्ब्डा कार्य ===
या लैम्ब्डा फ़ंक्शन के रूप में:
या लैम्ब्डा फ़ंक्शन के रूप में:<syntaxhighlight lang="sml">
 
val rec factorial = fn 0 => 1 | n => n * factorial (n - 1)
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
</syntaxhighlight>यहाँ, कीवर्ड {{code|lang=sml|val}} एक मूल्य के लिए एक पहचानकर्ता के बंधन का परिचय देता है, {{code|lang=sml|fn}} एक अनाम फ़ंक्शन का परिचय देता है, और {{code|lang=sml|rec}} परिभाषा को स्व-संदर्भित करने की अनुमति देता है।
वैल आरईसी फैक्टोरियल = एफएन 0 => 1 | n => n * क्रमगुणित (n - 1)
</वाक्यविन्यास हाइलाइट>
 
यहाँ, कीवर्ड {{code|lang=sml|val}} एक मूल्य के लिए एक पहचानकर्ता के बंधन का परिचय देता है, {{code|lang=sml|fn}} एक अनाम फ़ंक्शन का परिचय देता है, और {{code|lang=sml|rec}} परिभाषा को स्व-संदर्भित करने की अनुमति देता है।


=== स्थानीय परिभाषाएं ===
=== स्थानीय परिभाषाएं ===
एक अपरिवर्तनीय-मुक्त बाहरी फ़ंक्शन के भीतर एक या एक से अधिक संचायक मापदंडों के साथ एक अपरिवर्तनीय-संरक्षण पूंछ-पुनरावर्ती तंग लूप का एनकैप्सुलेशन, जैसा कि यहां देखा गया है, मानक एमएल में एक सामान्य मुहावरा है।
एक अपरिवर्तनीय-मुक्त बाहरी फ़ंक्शन के भीतर एक या एक से अधिक संचायक मापदंडों के साथ एक अपरिवर्तनीय-संरक्षण पूंछ-पुनरावर्ती तंग लूप का एनकैप्सुलेशन, जैसा कि यहां देखा गया है, मानक एमएल में एक सामान्य मुहावरा है।


स्थानीय फ़ंक्शन का उपयोग करके, इसे अधिक कुशल पूंछ-पुनरावर्ती शैली में फिर से लिखा जा सकता है:
स्थानीय फ़ंक्शन का उपयोग करके, इसे अधिक कुशल पूंछ-पुनरावर्ती शैली में फिर से लिखा जा सकता है:<syntaxhighlight lang="sml">
 
local
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
     fun loop (0, acc) = acc
स्थानीय
       | loop (m, acc) = loop (m - 1, m * acc)
     फन लूप (0, एसीसी) = एसीसी
in
       | लूप (एम, एसीसी) = लूप (एम - 1, एम * एसीसी)
     fun factorial n = loop (n, 1)
में
end
     फन फैक्टोरियल एन = लूप (एन, 1)
</syntaxhighlight>
अंत
</वाक्यविन्यास हाइलाइट>


=== समानार्थी शब्द टाइप करें ===
=== समानार्थी शब्द टाइप करें ===
एक प्रकार के समानार्थी को कीवर्ड के साथ परिभाषित किया गया है {{code|lang=sml|type}}. यहाँ एक समतल (ज्यामिति) पर बिंदुओं के लिए एक प्रकार का पर्यायवाची है, और दो बिंदुओं के बीच की दूरी की गणना करने वाले कार्य, और हेरोन के सूत्र के अनुसार दिए गए कोनों के साथ एक त्रिभुज का क्षेत्रफल। (इन परिभाषाओं का उपयोग बाद के उदाहरणों में किया जाएगा)।
एक प्रकार के समानार्थी को कीवर्ड के साथ परिभाषित किया गया है {{code|lang=sml|type}}. यहाँ एक समतल (ज्यामिति) पर बिंदुओं के लिए एक प्रकार का पर्यायवाची है, और दो बिंदुओं के बीच की दूरी की गणना करने वाले कार्य, और हेरोन के सूत्र के अनुसार दिए गए कोनों के साथ एक त्रिभुज का क्षेत्रफल। (इन परिभाषाओं का उपयोग बाद के उदाहरणों में किया जाएगा)।<syntaxhighlight lang="sml">
type loc = real * real


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
fun square (x : real) = x * x
प्रकार लोक = वास्तविक * वास्तविक


मज़ा वर्ग (एक्स : असली) = एक्स * एक्स
fun dist (x, y) (x', y') =
    Math.sqrt (square (x' - x) + square (y' - y))


मज़ा जिला (एक्स, वाई) (एक्स ', वाई') =
fun heron (a, b, c) = let
     Math.sqrt (वर्ग (x' - x) + वर्ग (y' - y))
     val x = dist a b
 
     val y = dist b c
मजेदार बगुला (ए, बी, सी) = चलो
     val z = dist a c
     वैल एक्स = डिस्ट ए बी
     val s = (x + y + z) / 2.0
     वैल वाई = जिला बी सी
     in
     वैल जेड = जिला सी
         Math.sqrt (s * (s - x) * (s - y) * (s - z))
    वैल एस = (एक्स + वाई + जेड) / 2.0
     end
     में
</syntaxhighlight>
         गणित.sqrt (s * (s - x) * (s - y) * (s - z))
     अंत
</वाक्यविन्यास हाइलाइट>


=== [[बीजगणितीय डेटा प्रकार]] ===
=== [[बीजगणितीय डेटा प्रकार]] ===
मानक एमएल बीजगणितीय डेटाटाइप्स (एडीटी) के लिए मजबूत समर्थन प्रदान करता है। एक डेटाटाइप को टुपल्स (या उत्पादों की राशि) के एक अलग संघ के रूप में माना जा सकता है। वे परिभाषित करने में आसान हैं और उपयोग में आसान हैं, मोटे तौर पर [[पैटर्न मिलान]] के साथ-साथ अधिकांश मानक एमएल कार्यान्वयन '[[आंशिक कार्य]] | पैटर्न-थकावट की जाँच और पैटर्न अतिरेक जाँच के कारण।
मानक एमएल बीजगणितीय डेटाटाइप्स (एडीटी) के लिए मजबूत समर्थन प्रदान करता है। एक डेटाटाइप को टुपल्स (या उत्पादों की राशि) के एक अलग संघ के रूप में माना जा सकता है। वे परिभाषित करने में आसान हैं और उपयोग में आसान हैं, मोटे तौर पर [[पैटर्न मिलान]] के साथ-साथ अधिकांश मानक एमएल कार्यान्वयन '[[आंशिक कार्य]] | पैटर्न-निकासता की जाँच और पैटर्न अतिरेक जाँच के कारण।
 
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, एक [[संघ अलग करना]] को क्लास पदानुक्रम के रूप में व्यक्त किया जा सकता है। हालाँकि, [[वर्ग पदानुक्रम]] के विपरीत, ADT बंद विश्व धारणा हैं। इस प्रकार ADTs की विस्तारशीलता वर्ग पदानुक्रमों की व्यापकता के लिए ओर्थोगोनल है। वर्ग पदानुक्रम को नए उपवर्गों के साथ बढ़ाया जा सकता है जो एक ही इंटरफ़ेस को लागू करते हैं, जबकि ADTs की कार्यक्षमता को निर्माणकर्ताओं के निश्चित सेट के लिए बढ़ाया जा सकता है। [[अभिव्यक्ति की समस्या]] देखें।


एक डेटाटाइप को कीवर्ड के साथ परिभाषित किया गया है {{code|lang=sml|datatype}}, के रूप में:
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, एक [[संघ अलग करना]] को क्लास पदानुक्रम के रूप में व्यक्त किया जा सकता है। हालाँकि, [[वर्ग पदानुक्रम]] के विपरीत, एडीटी बंद विश्व धारणा हैं। इस प्रकार एडीटी की विस्तारशीलता वर्ग पदानुक्रमों की व्यापकता के लिए ओर्थोगोनल है। वर्ग पदानुक्रम को नए उपवर्गों के साथ बढ़ाया जा सकता है जो एक ही इंटरफ़ेस को लागू करते हैं, जबकि एडीटी की कार्यक्षमता को निर्माणकर्ताओं के निश्चित सेट के लिए बढ़ाया जा सकता है। [[अभिव्यक्ति की समस्या]] देखें।


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
एक डेटाटाइप को कीवर्ड के साथ परिभाषित किया गया है {{code|lang=sml|datatype}}, के रूप में:<syntaxhighlight lang="sml">
डेटाटाइप आकार
datatype shape
     = नियंत्रण रेखा * वास्तविक (* केंद्र और त्रिज्या *)
     = Circle  of loc * real      (* center and radius *)
     | नियंत्रण रेखा का वर्ग * वास्तविक (* ऊपरी-बाएँ कोने और साइड की लंबाई; अक्ष-संरेखित *)
     | Square  of loc * real      (* upper-left corner and side length; axis-aligned *)
     | लोक का त्रिभुज * लोक * लोक (* कोने *)
     | Triangle of loc * loc * loc (* corners *)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>ध्यान दें कि एक प्रकार का समानार्थी पुनरावर्ती नहीं हो सकता है; रिकर्सिव कन्स्ट्रक्टर को परिभाषित करने के लिए डेटाटाइप आवश्यक हैं। (यह इस उदाहरण में मुद्दा नहीं है।)
 
ध्यान दें कि एक प्रकार का समानार्थी पुनरावर्ती नहीं हो सकता है; रिकर्सिव कन्स्ट्रक्टर को परिभाषित करने के लिए डेटाटाइप आवश्यक हैं। (यह इस उदाहरण में मुद्दा नहीं है।)


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


फ़ंक्शन तर्कों को निम्नानुसार पैटर्न के रूप में परिभाषित किया जा सकता है:
फ़ंक्शन तर्कों को निम्नानुसार पैटर्न के रूप में परिभाषित किया जा सकता है:<syntaxhighlight lang="sml">
 
fun area (Circle (_, r)) = Math.pi * square r
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
   | area (Square (_, s)) = square s
मज़ा क्षेत्र (वृत्त (_, आर)) = गणित.पी * वर्ग आर
   | area (Triangle p) = heron p (* see above *)
   | क्षेत्रफल (वर्ग (_, s)) = वर्ग s
</syntaxhighlight>फ़ंक्शन परिभाषा का तथाकथित क्लॉसल रूप, जहां तर्कों को पैटर्न के रूप में परिभाषित किया जाता है, केस एक्सप्रेशन के लिए केवल [[सिंटैक्टिक चीनी]] है:<syntaxhighlight lang="sml">
   | क्षेत्रफल (त्रिभुज p) = बगुला p (* ऊपर देखें *)
fun area shape = case shape of
</वाक्यविन्यास हाइलाइट>
     Circle (_, r) => Math.pi * square r
 
   | Square (_, s) => square s
फ़ंक्शन परिभाषा का तथाकथित क्लॉसल रूप, जहां तर्कों को पैटर्न के रूप में परिभाषित किया जाता है, केस एक्सप्रेशन के लिए केवल [[सिंटैक्टिक चीनी]] है:
   | Triangle p => heron p
 
</syntaxhighlight>
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
फन एरिया शेप = केस शेप ऑफ
     वृत्त (_, आर) => गणित.पी * वर्ग आर
   | वर्ग (_, s) => वर्ग s
   | त्रिभुज p => बगुला p
</वाक्यविन्यास हाइलाइट>


==== संपूर्णता जाँच ====
==== संपूर्णता जाँच ====
पैटर्न-विस्तृतता जांच सुनिश्चित करेगी कि डेटाटाइप के प्रत्येक कन्स्ट्रक्टर कम से कम एक पैटर्न से मेल खाते हैं।
पैटर्न-विस्तृतता जांच सुनिश्चित करेगी कि डेटाटाइप के प्रत्येक कन्स्ट्रक्टर कम से कम एक पैटर्न से मेल खाते हैं।


निम्नलिखित पैटर्न संपूर्ण नहीं है:
निम्नलिखित पैटर्न संपूर्ण नहीं है:<syntaxhighlight lang="sml">
 
fun center (Circle (c, _)) = c
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
   | center (Square ((x, y), s)) = (x + s / 2.0, y + s / 2.0)
फन सेंटर (सर्कल (सी, _)) = सी
</syntaxhighlight>के लिए कोई पैटर्न नहीं है {{code|Triangle}} मामले में {{code|center}} समारोह। कंपाइलर एक चेतावनी जारी करेगा कि केस एक्सप्रेशन संपूर्ण नहीं है, और यदि a {{code|Triangle}} रनटाइम पर इस फ़ंक्शन को पास किया जाता है, {{code|lang=sml|exception Match}} उठाया जाएगा।
   | केंद्र (वर्ग ((x, y), s)) = (x + s / 2.0, y + s / 2.0)
</वाक्यविन्यास हाइलाइट>
 
के लिए कोई पैटर्न नहीं है {{code|Triangle}} मामले में {{code|center}} समारोह। कंपाइलर एक चेतावनी जारी करेगा कि केस एक्सप्रेशन संपूर्ण नहीं है, और यदि a {{code|Triangle}} रनटाइम पर इस फ़ंक्शन को पास किया जाता है, {{code|lang=sml|exception Match}} उठाया जाएगा।


==== अतिरेक जाँच ====
==== अतिरेक जाँच ====
निम्नलिखित (अर्थहीन) फ़ंक्शन के दूसरे खंड में पैटर्न बेमानी है:
पैटर्न निम्नलिखित (अर्थहीन) फ़ंक्शन के दूसरे खंड में अनावश्यक है:<syntaxhighlight lang="sml">
 
fun f (Circle ((x, y), r)) = x + y
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
   | f (Circle _) = 1.0
fun f (वृत्त ((x, y), r)) = x + y
   | f _ = 0.0
   | एफ (सर्कल _) = 1.0
</syntaxhighlight>कोई भी मान जो दूसरे क्लॉज में पैटर्न से मेल खाता है, पहले क्लॉज के पैटर्न से भी मेल खाएगा, इसलिए दूसरा क्लॉज अप्राप्य है। इसलिए, यह परिभाषा पूर्ण अतिरेक प्रदर्शित करती है और संकलन-समय की चेतावनी देती है।
   | एफ _ = 0.0
</वाक्यविन्यास हाइलाइट>
 
कोई भी मान जो दूसरे क्लॉज में पैटर्न से मेल खाता है, वह पहले क्लॉज के पैटर्न से भी मेल खाएगा, इसलिए दूसरा क्लॉज अगम्य है। इसलिए, यह परिभाषा पूरी तरह से अनावश्यकता प्रदर्शित करती है, और संकलन-समय की चेतावनी का कारण बनती है।
 
निम्नलिखित फ़ंक्शन परिभाषा संपूर्ण है और अनावश्यक नहीं है:
 
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
वैल हैकॉर्नर्स = fn (सर्कल _) => झूठा | _ => सत्य
</वाक्यविन्यास हाइलाइट>


यदि नियंत्रण पहले पैटर्न से आगे निकल जाता है ({{code|Circle}}), हम जानते हैं कि आकार या तो होना चाहिए {{code|Square}} या ए {{code|Triangle}}. इनमें से किसी भी स्थिति में, हम जानते हैं कि आकृति के कोने हैं, इसलिए हम वापस लौट सकते हैं {{code|lang=sml|true}} वास्तविक स्वरूप को जाने बिना।
निम्नलिखित फ़ंक्शन परिभाषा संपूर्ण है और अनावश्यक नहीं है:<syntaxhighlight lang="sml">
val hasCorners = fn (Circle _) => false | _ => true
</syntaxhighlight>यदि नियंत्रण पहले पैटर्न से आगे निकल जाता है ({{code|Circle}}), हम जानते हैं कि आकार या तो होना चाहिए {{code|Square}} या ए {{code|Triangle}}. इनमें से किसी भी स्थिति में, हम जानते हैं कि आकृति के कोने हैं, इसलिए हम वापस लौट सकते हैं {{code|lang=sml|true}} वास्तविक स्वरूप को जाने बिना।


=== उच्च-क्रम के कार्य ===
=== उच्च-क्रम के कार्य ===
Line 176: Line 134:


कार्य भी कार्यों का उपभोग और उत्पादन दोनों कर सकते हैं:
कार्य भी कार्यों का उपभोग और उत्पादन दोनों कर सकते हैं:
<syntaxhighlight lang= sml>fun कंपोज़ (f, g) = (fn x => f (g x))</syntaxhighlight>
<syntaxhighlight lang="sml">fun compose (f, g) = (fn x => f (g x))</syntaxhighlight>
 
कार्यक्रम {{code|List.map}} आधार पुस्तकालय से मानक एमएल में सबसे अधिक इस्तेमाल किए जाने वाले उच्च-क्रम के कार्यों में से एक है:
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
फन मैप _ [] = []
  | मानचित्र f (x :: xs) = f x :: मानचित्र f xs
</वाक्यविन्यास हाइलाइट>


पूंछ-पुनरावर्ती के साथ एक अधिक कुशल कार्यान्वयन {{code|List.foldl}}:
कार्यक्रम {{code|List.map}} आधार पुस्तकालय से मानक एमएल में सबसे अधिक उपयोग किए जाने वाले उच्च-क्रम के कार्यों में से एक है<syntaxhighlight lang="sml">
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
fun map _ [] = []
  | map f (x :: xs) = f x :: map f xs
</syntaxhighlight>पूंछ-पुनरावर्ती के साथ एक अधिक कुशल कार्यान्वयन {{code|List.foldl}}:<syntaxhighlight lang="sml">
fun map f = List.rev o List.foldl (fn (x, acc) => f x :: acc) []
fun map f = List.rev o List.foldl (fn (x, acc) => f x :: acc) []
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


=== अपवाद ===
=== अपवाद ===
अपवाद कीवर्ड के साथ उठाए जाते हैं {{code|lang=sml|raise}} और पैटर्न मिलान के साथ संभाला {{code|lang=sml|handle}} निर्माण। अपवाद प्रणाली [[गैर-स्थानीय निकास]] को लागू कर सकती है; यह अनुकूलन तकनीक निम्नलिखित जैसे कार्यों के लिए उपयुक्त है।
अपवाद कीवर्ड के साथ उठाए जाते हैं {{code|lang=sml|raise}} और पैटर्न मिलान के साथ संभाला {{code|lang=sml|handle}} निर्माण। अपवाद प्रणाली [[गैर-स्थानीय निकास]] को लागू कर सकती है; यह अनुकूलन तकनीक निम्नलिखित जैसे कार्यों के लिए उपयुक्त है।<syntaxhighlight lang="sml">
local
    exception Zero;
    val p = fn (0, _) => raise Zero | (a, b) => a * b
in
    fun prod xs = List.foldl p 1 xs handle Zero => 0
end
</syntaxhighlight>कब {{code|lang=sml|exception Zero}} उठाया जाता है, नियंत्रण कार्य छोड़ देता है {{code|lang=sml|List.foldl}} कुल मिलाकर। विकल्प पर विचार करें: मान 0 लौटाया जाएगा, इसे सूची में अगले पूर्णांक से गुणा किया जाएगा, परिणामी मान (अनिवार्य रूप से 0) वापस किया जाएगा, और इसी तरह। अपवाद को बढ़ाने से फ्रेम की पूरी श्रृंखला को छोड़ने और संबंधित संगणना से बचने के लिए नियंत्रण की अनुमति मिलती है। अंडरस्कोर के उपयोग पर ध्यान दें ({{code|_}}) वाइल्डकार्ड पैटर्न के रूप में।


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
[[टेल कॉल]] के साथ समान अनुकूलन प्राप्त किया जा सकता है।<syntaxhighlight lang="sml">
स्थानीय
local
    अपवाद शून्य;
     fun p a (0 :: _) = 0
    वैल पी = एफएन (0, _) => जीरो बढ़ाएं (ए, बी) => ए * बी
       | p a (x :: xs) = p (a * x) xs
में
       | p a [] = a
    fun prod xs = List.foldl p 1 xs हैंडल जीरो => 0
in
अंत
     val prod = p 1
</वाक्यविन्यास हाइलाइट>
end
 
</syntaxhighlight>
कब {{code|lang=sml|exception Zero}} उठाया जाता है, नियंत्रण कार्य छोड़ देता है {{code|lang=sml|List.foldl}} कुल मिलाकर। विकल्प पर विचार करें: मान 0 लौटाया जाएगा, इसे सूची में अगले पूर्णांक से गुणा किया जाएगा, परिणामी मान (अनिवार्य रूप से 0) वापस किया जाएगा, और इसी तरह। अपवाद को बढ़ाने से फ्रेम की पूरी श्रृंखला को छोड़ने और संबंधित संगणना से बचने के लिए नियंत्रण की अनुमति मिलती है। अंडरस्कोर के उपयोग पर ध्यान दें ({{code|_}}) वाइल्डकार्ड पैटर्न के रूप में।
 
[[टेल कॉल]] के साथ समान अनुकूलन प्राप्त किया जा सकता है।
 
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
स्थानीय
     मज़ा पी ए (0 :: _) = 0
       | पी ए (एक्स :: एक्सएस) = पी (* एक्स) एक्सएस
       | पी ए [] =
में
     वैल प्रोड = पी 1
अंत
</वाक्यविन्यास हाइलाइट>


=== मॉड्यूल सिस्टम ===
=== मॉड्यूल सिस्टम ===
मानक एमएल की उन्नत मॉड्यूल प्रणाली कार्यक्रमों को तार्किक रूप से संबंधित प्रकार और मूल्य परिभाषाओं के पदानुक्रमित संगठित संरचनाओं में विघटित करने की अनुमति देती है। मॉड्यूल न केवल नामस्थान नियंत्रण प्रदान करते हैं बल्कि अमूर्तता भी प्रदान करते हैं, इस अर्थ में कि वे [[सार डेटा प्रकार]]ों की परिभाषा की अनुमति देते हैं। तीन मुख्य सिंटैक्टिक संरचनाओं में मॉड्यूल सिस्टम शामिल है: हस्ताक्षर, संरचनाएं और फ़ैक्टर।
मानक एमएल की उन्नत मॉड्यूल प्रणाली कार्यक्रमों को तार्किक रूप से संबंधित प्रकार और मूल्य परिभाषाओं के पदानुक्रमित संगठित संरचनाओं में विघटित करने की अनुमति देती है। मॉड्यूल न केवल नामस्थान नियंत्रण प्रदान करते हैं बल्कि अमूर्तता भी प्रदान करते हैं, इस अर्थ में कि वे [[सार डेटा प्रकार]] की परिभाषा की अनुमति देते हैं। तीन मुख्य सिंटैक्टिक संरचनाओं में मॉड्यूल सिस्टम सम्मिलित है: हस्ताक्षर, संरचनाएं और फ़ैक्टर।


====हस्ताक्षर====
====हस्ताक्षर====
एक हस्ताक्षर एक [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] है, जिसे आमतौर पर संरचना के लिए एक प्रकार के रूप में माना जाता है; यह संरचना द्वारा प्रदान की गई सभी संस्थाओं के नाम के साथ-साथ प्रत्येक प्रकार के घटक, प्रत्येक मूल्य घटक के प्रकार और प्रत्येक उपसंरचना के हस्ताक्षर को निर्दिष्ट करता है। प्रकार के घटकों की परिभाषाएँ वैकल्पिक हैं; प्रकार के घटक जिनकी परिभाषाएँ छिपी हुई हैं वे सार प्रकार हैं।
एक हस्ताक्षर एक [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] है, जिसे सामान्यतः संरचना के लिए एक प्रकार के रूप में माना जाता है; यह संरचना द्वारा प्रदान की गई सभी संस्थाओं के नाम के साथ-साथ प्रत्येक प्रकार के घटक, प्रत्येक मूल्य घटक के प्रकार और प्रत्येक उपसंरचना के हस्ताक्षर को निर्दिष्ट करता है। प्रकार के घटकों की परिभाषाएँ वैकल्पिक हैं; प्रकार के घटक जिनकी परिभाषाएँ छिपी हुई हैं वे सार प्रकार हैं।


उदाहरण के लिए, [[कतार (डेटा संरचना)]] के लिए हस्ताक्षर हो सकते हैं:
उदाहरण के लिए, [[कतार (डेटा संरचना)]] के लिए हस्ताक्षर हो सकते हैं:<syntaxhighlight lang="sml">
 
signature QUEUE = sig
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
     type 'a queue
हस्ताक्षर कतार = हस्ताक्षर
     exception QueueError;
     टाइप करें 'एक कतार
     val empty    : 'a queue
     अपवाद कतार त्रुटि;
     val isEmpty  : 'a queue -> bool
     वैल खाली: 'एक कतार
     val singleton : 'a -> 'a queue
     वैल खाली है: 'एक कतार -> बूल
     val fromList  : 'a list -> 'a queue
     वैल सिंगलटन: '->' एक कतार
     val insert    : 'a * 'a queue -> 'a queue
     सूची से वैल: 'एक सूची ->' एक कतार
     val peek      : 'a queue -> 'a
     वैल इन्सर्ट: '* 'ए क्यू ->' ए क्यू
     val remove    : 'a queue -> 'a * 'a queue
     वैल पीक: 'एक कतार ->' a
end
     वैल निकालें: 'एक कतार ->' एक * 'एक कतार
</syntaxhighlight>यह हस्ताक्षर एक मॉड्यूल का वर्णन करता है जो बहुरूपी प्रकार प्रदान करता है {{code|lang=sml|'a queue}}, {{code|lang=sml|exception QueueError}}, और मान जो कतारों पर बुनियादी संचालन को परिभाषित करते हैं।
अंत
</वाक्यविन्यास हाइलाइट>
 
यह हस्ताक्षर एक मॉड्यूल का वर्णन करता है जो बहुरूपी प्रकार प्रदान करता है {{code|lang=sml|'a queue}}, {{code|lang=sml|exception QueueError}}, और मान जो कतारों पर बुनियादी संचालन को परिभाषित करते हैं।


==== संरचनाएं ====
==== संरचनाएं ====
एक संरचना एक मॉड्यूल है; इसमें एक तार्किक इकाई में एक साथ पैक किए गए प्रकारों, अपवादों, मूल्यों और संरचनाओं (जिन्हें सबस्ट्रक्चर कहा जाता है) का संग्रह होता है।
एक स्ट्रक्चर एक मॉड्यूल है; इसमें एक तार्किक इकाई में एक साथ पैक किए गए प्रकारों, अपवादों, मूल्यों और संरचनाओं (सबस्ट्रक्चर कहा जाता है) का एक संग्रह होता है।


एक कतार संरचना को निम्नानुसार कार्यान्वित किया जा सकता है:
एक कतार संरचना को निम्नानुसार कार्यान्वित किया जा सकता है:<syntaxhighlight lang="sml">
structure TwoListQueue :> QUEUE = struct
    type 'a queue = 'a list * 'a list


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
     exception QueueError;
संरचना TwoListQueue :> QUEUE = struct
     टाइप करें 'एक कतार =' एक सूची * 'एक सूची


     अपवाद कतार त्रुटि;
     val empty = ([], [])


     वैल खाली = ([], [])
     fun isEmpty ([], []) = true
      | isEmpty _ = false


     fun isEmpty ([], []) = सच
     fun singleton a = ([], [a])
      | isEmpty _ = झूठा है


     फन सिंगलटन ए = ([], [ए])
     fun fromList a = ([], a)


     सूची से मज़ा = ([], )
     fun insert (a, ([], [])) = singleton a
      | insert (a, (ins, outs)) = (a :: ins, outs)


     मज़ा सम्मिलित करें (ए, ([], [])) = सिंगलटन ए
     fun peek (_, []) = raise QueueError
       | सम्मिलित करें (, (इन्स, आउट)) = (ए :: इन्स, आउट)
       | peek (ins, outs) = List.hd outs


     फन पीक (_, []) = कतार बढ़ाएँ
     fun remove (_, []) = raise QueueError
       | झांकना (इन्स, आउटस) = List.hd outs
       | remove (ins, [a]) = (a, ([], List.rev ins))
      | remove (ins, a :: outs) = (a, (ins, outs))
end
</syntaxhighlight>यह परिभाषा इसकी घोषणा करती है {{code|lang=sml|structure TwoListQueue}} औजार {{code|lang=sml|signature QUEUE}}. इसके अलावा, अपारदर्शी शिलालेख द्वारा निरूपित {{code|lang=sml|:>}} बताता है कि कोई भी प्रकार जो हस्ताक्षर में परिभाषित नहीं है (अर्थात {{code|lang=sml|type 'a queue}}) अमूर्त होना चाहिए, जिसका अर्थ है कि सूची की एक जोड़ी के रूप में कतार की परिभाषा मॉड्यूल के बाहर दिखाई नहीं दे रही है। संरचना हस्ताक्षर में सभी परिभाषाओं को लागू करती है।


    fun हटाएं (_, []) = कतार बढ़ाएं
संरचना में प्रकार और मूल्यों को डॉट नोटेशन के साथ एक्सेस किया जा सकता है:<syntaxhighlight lang="sml">
      | हटाएं (इन्स, [ए]) = (ए, ([], लिस्ट.रेव इन्स))
val q : string TwoListQueue.queue = TwoListQueue.empty
      | हटाएं (इन्स, ए :: आउट) = (ए, (इन्स, आउट्स))
val q' = TwoListQueue.insert (Real.toString Math.pi, q)
अंत
</syntaxhighlight>
</वाक्यविन्यास हाइलाइट>
 
यह परिभाषा इसकी घोषणा करती है {{code|lang=sml|structure TwoListQueue}} औजार {{code|lang=sml|signature QUEUE}}. इसके अलावा, अपारदर्शी शिलालेख द्वारा निरूपित {{code|lang=sml|:>}} बताता है कि कोई भी प्रकार जो हस्ताक्षर में परिभाषित नहीं है (अर्थात {{code|lang=sml|type 'a queue}}) अमूर्त होना चाहिए, जिसका अर्थ है कि सूची की एक जोड़ी के रूप में कतार की परिभाषा मॉड्यूल के बाहर दिखाई नहीं दे रही है। संरचना हस्ताक्षर में सभी परिभाषाओं को लागू करती है।
 
संरचना में प्रकार और मूल्यों को डॉट नोटेशन के साथ एक्सेस किया जा सकता है:
 
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
वैल क्यू: स्ट्रिंग TwoListQueue.queue = TwoListQueue.empty
वैल q' = TwoListQueue.insert (Real.toString Math.pi, q)
</वाक्यविन्यास हाइलाइट>


==== फंक्टर्स ====
==== फंक्टर्स ====
एक फ़ैक्टर संरचनाओं से संरचनाओं का एक कार्य है; अर्थात्, एक मज़ेदार एक या एक से अधिक तर्कों को स्वीकार करता है, जो आम तौर पर दिए गए हस्ताक्षर की संरचनाएं होती हैं, और इसके परिणाम के रूप में संरचना उत्पन्न करती हैं। [[सामान्य प्रोग्रामिंग]] डेटा संरचनाओं और एल्गोरिदम को लागू करने के लिए फ़ंक्टर्स का उपयोग किया जाता है।
एक फ़ैक्टर संरचनाओं से संरचनाओं का एक कार्य है; अर्थात्, एक मज़ेदार एक या एक से अधिक तर्कों को स्वीकार करता है, जो सामान्यतः दिए गए हस्ताक्षर की संरचनाएं होती हैं, और इसके परिणाम के रूप में संरचना उत्पन्न करती हैं। [[सामान्य प्रोग्रामिंग]] डेटा संरचनाओं और एल्गोरिदम को लागू करने के लिए फ़ंक्टर्स का उपयोग किया जाता है।
 
एक लोकप्रिय एल्गोरिदम<ref name="bfs" />पेड़ों की चौड़ाई-पहले खोज के लिए कतारों का उपयोग किया जाता है। यहाँ हम उस एल्गोरिथम का एक संस्करण प्रस्तुत करते हैं जो एक अमूर्त कतार संरचना पर परिचालित होता है:


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
एक लोकप्रिय एल्गोरिदम<ref name="bfs" /> ट्री की चौड़ाई-पहले खोज के लिए कतारों का उपयोग किया जाता है। यहाँ हम उस एल्गोरिथम का एक संस्करण प्रस्तुत करते हैं जो एक अमूर्त कतार संरचना पर परिचालित होता है:<syntaxhighlight lang="sml">
(* ओकासाकी, ICFP, 2000 के बाद *)
(* after Okasaki, ICFP, 2000 *)
functor BFS (Q: QUEUE) = struct
functor BFS (Q: QUEUE) = struct
   डेटाटाइप 'एक पेड़ = | टी का 'एक * 'एक पेड़ * 'एक पेड़
   datatype 'a tree = E | T of 'a * 'a tree * 'a tree
 
  स्थानीय
    fun bfsQ q = यदि Q.isEmpty q है तो [] और खोजें (Q.remove q)
    और खोज (ई, क्यू) = बीएफएसक्यू क्यू
      | खोज (टी (एक्स, एल, आर), क्यू) = एक्स :: बीएफएसक्यू (डालें (क्यू एल डालें) आर)
    और डालें q a = Q. डालें (a, q)
  में
    fun bfs t = bfsQ (Q.सिंगलटन t)
  अंत
अंत


संरचना QueueBFS = BFS (दो सूची कतार)
  local
</वाक्यविन्यास हाइलाइट>
    fun bfsQ q = if Q.isEmpty q then [] else search (Q.remove q)
    and search (E, q) = bfsQ q
      | search (T (x, l, r), q) = x :: bfsQ (insert (insert q l) r)
    and insert q a = Q.insert (a, q)
  in
    fun bfs t = bfsQ (Q.singleton t)
  end
end


अंदर {{code|lang=sml|functor BFS}}क्यू का प्रतिनिधित्व दिखाई नहीं दे रहा है। अधिक ठोस रूप से, दो-सूची कतार में पहली सूची का चयन करने का कोई तरीका नहीं है, यदि वास्तव में इसका उपयोग किया जा रहा है। यह डेटा अमूर्त तंत्र कतार के कार्यान्वयन के लिए चौड़ाई-पहली खोज को वास्तव में अज्ञेयवादी बनाता है। यह सामान्य रूप से वांछनीय है; इस मामले में, कतार संरचना सुरक्षित रूप से किसी भी तार्किक आक्रमणकारियों को बनाए रख सकती है, जिस पर अमूर्तता की बुलेटप्रूफ दीवार के पीछे इसकी शुद्धता निर्भर करती है।
structure QueueBFS = BFS (TwoListQueue)
</syntaxhighlight>अंदर {{code|lang=sml|functor BFS}} का प्रतिनिधित्व दिखाई नहीं दे रहा है। अधिक ठोस रूप से, दो-सूची कतार में पहली सूची का चयन करने का कोई तरीका नहीं है, यदि वास्तव में इसका उपयोग किया जा रहा है। यह डेटा अमूर्त तंत्र कतार के कार्यान्वयन के लिए चौड़ाई-पहली खोज को वास्तव में अज्ञेयवादी बनाता है। यह सामान्य रूप से वांछनीय है; इस मामले में, कतार संरचना सुरक्षित रूप से किसी भी तार्किक आक्रमणकारियों को बनाए रख सकती है, जिस पर अमूर्तता की बुलेटप्रूफ दीवार के पीछे इसकी शुद्धता निर्भर करती है।


== कोड उदाहरण ==
== कोड उदाहरण ==
{{wikibook|Standard ML Programming}}
{{wikibook|Standard ML Programming}}
{{unreferenced section|date=June 2013}}
एसएमएल कोड के स्निपेट्स को रीड–इवल–प्रिंट लूप|इंटरएक्टिव टॉप-लेवल में डालकर सबसे आसानी से अध्ययन किया जाता है।
SML कोड के स्निपेट्स को रीड–इवल–प्रिंट लूप|इंटरैक्टिव टॉप-लेवल में दर्ज करके सबसे आसानी से अध्ययन किया जाता है।


=== हैलो वर्ल्ड ===
=== हैलो वर्ल्ड ===
Line 331: Line 264:
</syntaxhighlight>
</syntaxhighlight>
|}
|}


=== एल्गोरिदम ===
=== एल्गोरिदम ===


==== सम्मिलन क्रम ====
==== सम्मिलन क्रम ====
के लिए निवेशन छँटाई {{code|lang=sml|int list}} (आरोही) संक्षेप में निम्नानुसार व्यक्त किया जा सकता है:
के लिए निवेशन छँटाई {{code|lang=sml|int list}} (आरोही) संक्षेप में निम्नानुसार व्यक्त किया जा सकता है:<syntaxhighlight lang="sml">
 
fun insert (x, []) = [x] | insert (x, h :: t) = sort x (h, t)
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
and sort x (h, t) = if x < h then [x, h] @ t else h :: insert (x, t)
फन इंसर्ट (x, []) = [x] | सम्मिलित करें (एक्स, एच :: टी) = सॉर्ट एक्स (एच, टी)
val insertionsort = List.foldl insert []
और क्रमबद्ध करें x (h, t) = यदि x <h तो [x, h] @ t और h :: डालें (x, t)
</syntaxhighlight>
वैल सम्मिलन = List.foldl सम्मिलित करें []
</वाक्यविन्यास हाइलाइट>


==== मर्जसॉर्ट ====
==== मर्जसॉर्ट ====
{{main|Merge sort}}
{{main|मर्ज सॉर्ट}}
यहां, क्लासिक मर्जसॉर्ट एल्गोरिथ्म को तीन कार्यों में लागू किया गया है: स्प्लिट, मर्ज और मर्जसॉर्ट। सिंटैक्स के अपवाद के साथ, प्रकारों की अनुपस्थिति पर भी ध्यान दें {{code|lang=sml|op ::}} और {{code|lang=sml|[]}} जो सूचियों को दर्शाता है। यह कोड किसी भी प्रकार की सूचियों को सॉर्ट करेगा, जब तक कि एक सुसंगत ऑर्डरिंग फ़ंक्शन {{code|cmp}} परिभाषित किया गया। हिंडले-मिलनर प्रकार के अनुमान का उपयोग करके, सभी चर के प्रकारों का अनुमान लगाया जा सकता है, यहां तक ​​कि जटिल प्रकार जैसे कि फ़ंक्शन का भी {{code|cmp}}.
यहां, क्लासिक मर्जसॉर्ट एल्गोरिथ्म को तीन कार्यों में लागू किया गया है: स्प्लिट, मर्ज और मर्जसॉर्ट। सिंटैक्स के अपवाद के साथ, प्रकारों की अनुपस्थिति पर भी ध्यान दें {{code|lang=sml|op ::}} और {{code|lang=sml|[]}} जो सूचियों को दर्शाता है। यह कोड किसी भी प्रकार की सूचियों को सॉर्ट करेगा, जब तक कि एक सुसंगत ऑर्डरिंग फ़ंक्शन {{code|cmp}} परिभाषित किया गया। हिंडले-मिलनर प्रकार के अनुमान का उपयोग करके, सभी चर के प्रकारों का अनुमान लगाया जा सकता है,
 
विभाजित करना


{{code|lang=sml|fun split}} एक [[राज्य (कंप्यूटर विज्ञान)]] क्लोजर के साथ लागू किया जाता है, जो बीच में वैकल्पिक होता है {{code|true}} और {{code|false}}, इनपुट की अनदेखी:
यहाँ {{code|cmp}} कार्यों जैसे जटिल प्रकारों को भी विभाजित करता है  


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
{{code|lang=sml|fun split}} एक [[राज्य (कंप्यूटर विज्ञान)]] क्लोजर के साथ लागू किया जाता है, जो बीच में वैकल्पिक होता है {{code|true}} और {{code|false}}, इनपुट की अनदेखी:<syntaxhighlight lang="sml">
फन अल्टरनेटर {} = वैल स्टेट = रेफ ट्रू
fun alternator {} = let val state = ref true
     in fn a => !state से पहले state := नहीं (!state) अंत
     in fn a => !state before state := not (!state) end


(* एक सूची को आधे-अधूरे भागों में विभाजित करें जो या तो समान लंबाई की हों,
(* Split a list into near-halves which will either be the same length,
  *या पहले में एक तत्व दूसरे से अधिक होगा।
  * or the first will have one more element than the other.
  * O(n) समय में चलता है, जहाँ n = |xs|.
  * Runs in O(n) time, where n = |xs|.
  *)
  *)
fun स्प्लिट xs = List.partition (अल्टरनेटर {}) xs
fun split xs = List.partition (alternator {}) xs
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


मर्ज
'''मर्ज (विलय)'''


दक्षता के लिए विलय स्थानीय फ़ंक्शन लूप का उपयोग करता है। भीतरी {{code|loop}} मामलों के संदर्भ में परिभाषित किया गया है: जब दोनों सूचियाँ खाली नहीं हैं ({{code|lang=sml|x :: xs}}) और जब एक सूची खाली हो ({{code|lang=sml|[]}}).
दक्षता के लिए विलय स्थानीय फ़ंक्शन लूप का उपयोग करता है। भीतरी {{code|loop}} मामलों के संदर्भ में परिभाषित किया गया है: जब दोनों सूचियाँ खाली नहीं हैं ({{code|lang=sml|x :: xs}}) और जब एक सूची खाली हो ({{code|lang=sml|[]}}).


यह फ़ंक्शन दो क्रमबद्ध सूचियों को एक क्रमबद्ध सूची में मिला देता है। ध्यान दें कि कैसे संचायक {{code|acc}} पीछे की ओर बनाया जाता है, फिर लौटाए जाने से पहले उलट दिया जाता है। यह एक सामान्य तकनीक है, चूंकि {{code|lang=sml|'a list}} एक लिंक्ड सूची के रूप में दर्शाया गया है # लिंक्ड सूचियाँ बनाम डायनामिक_एरे; इस तकनीक के लिए अधिक क्लॉक टाइम की आवश्यकता होती है, लेकिन स्पर्शोन्मुख विश्लेषण # अनुप्रयोग खराब नहीं होते हैं।
यह फ़ंक्शन दो क्रमबद्ध सूचियों को एक क्रमबद्ध सूची में मिला देता है। ध्यान दें कि कैसे संचायक {{code|acc}} पीछे की ओर बनाया जाता है, फिर लौटाए जाने से पहले उलट दिया जाता है। यह एक सामान्य तकनीक है, चूंकि {{code|lang=sml|'a list}} एक लिंक्ड सूची के रूप में दर्शाया गया है # लिंक्ड सूचियाँ बनाम डायनामिक_एरे; इस तकनीक के लिए अधिक क्लॉक टाइम की आवश्यकता होती है, लेकिन स्पर्शोन्मुख विश्लेषण अनुप्रयोग खराब नहीं होते हैं।<syntaxhighlight lang="sml">
 
(* Merge two ordered lists using the order cmp.
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
  * Pre: each list must already be ordered per cmp.
(* ऑर्डर सीएमपी का उपयोग करके दो ऑर्डर की गई सूचियों को मर्ज करें।
  * Runs in O(n) time, where n = |xs| + |ys|.
  * पूर्व: प्रत्येक सूची को पहले से ही प्रति सीएमपी आदेशित किया जाना चाहिए।
  * O(n) समय में चलता है, जहाँ n = |xs| + |वाईएस|.
  *)
  *)
फन मर्ज सीएमपी (xs, []) = xs
fun merge cmp (xs, []) = xs
   | विलय सीएमपी (एक्सएस, वाई :: वाईएस) = चलो
   | merge cmp (xs, y :: ys) = let
     फन लूप (, एसीसी) (एक्सएस, []) = List.revAppend (:: एसीसी, एक्सएस)
     fun loop (a, acc) (xs, []) = List.revAppend (a :: acc, xs)
       | लूप (, एसीसी) (एक्सएस, वाई :: वाईएस) =
       | loop (a, acc) (xs, y :: ys) =
         अगर सीएमपी (, वाई)
         if cmp (a, y)
         फिर लूप (y, a :: acc) (ys, xs)
         then loop (y, a :: acc) (ys, xs)
         अन्य लूप (, वाई :: एसीसी) (एक्सएस, वाईएस)
         else loop (a, y :: acc) (xs, ys)
     में
     in
         लूप (y, []) (ys, xs)
         loop (y, []) (ys, xs)
     अंत
     end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>'''मर्ज सॉर्ट'''
 
मर्ज़ सॉर्ट
 
मुख्य कार्य:


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
मुख्य कार्य:<syntaxhighlight lang="sml">
फन एपी एफ (एक्स, वाई) = (एफ एक्स, एफ वाई)
fun ap f (x, y) = (f x, f y)


(* दिए गए ऑर्डरिंग ऑपरेशन सीएमपी के अनुसार सूची को क्रमबद्ध करें।
(* Sort a list in according to the given ordering operation cmp.
  * O(n log n) समय में चलता है, जहाँ n = |xs|
  * Runs in O(n log n) time, where n = |xs|.
  *)
  *)
fun मर्जसॉर्ट सीएमपी [] = []
fun mergesort cmp [] = []
   | विलय सीएमपी [एक्स] = [एक्स]
   | mergesort cmp [x] = [x]
   | मर्जसॉर्ट सीएमपी एक्सएस = (मर्ज सीएमपी ओ एपी (मर्जसॉर्ट सीएमपी) ओ स्प्लिट) एक्सएस
   | mergesort cmp xs = (merge cmp o ap (mergesort cmp) o split) xs
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== क्विकॉर्ट ====
==== क्विकॉर्ट ====
{{main|Quicksort}}
{{main|क्विकसॉर्ट}}
क्विकसॉर्ट को निम्नानुसार व्यक्त किया जा सकता है। {{code|lang=sml|fun part}} एक [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]] है जो ऑर्डर ऑपरेटर का उपभोग करता है {{code|lang=sml|op <<}}.
क्विकसॉर्ट को निम्नानुसार व्यक्त किया जा सकता है। {{code|lang=sml|fun part}} एक [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]] है जो ऑर्डर ऑपरेटर का उपभोग करता है {{code|lang=sml|op <<}}.<syntaxhighlight lang="sml">
infix <<


<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
fun quicksort (op <<) = let
इन्फिक्स <<
     fun part p = List.partition (fn x => x << p)
 
     fun sort [] = []
fun Quicksort (op <<) = let
       | sort (p :: xs) = join p (part p xs)
     मज़ा भाग p = सूची। विभाजन (fn x => x << p)
     and join p (l, r) = sort l @ p :: sort r
     मजेदार छँटाई [] = []
     in
       | क्रमबद्ध करें (पी :: एक्सएस) = पी में शामिल हों (भाग पी एक्सएस)
         sort
     और पी (एल, आर) = सॉर्ट एल @ पी :: सॉर्ट आर में शामिल हों
     end
     में
</syntaxhighlight>
         क्रम से लगाना
     अंत
</वाक्यविन्यास हाइलाइट>


=== अभिव्यक्ति दुभाषिया ===
=== अभिव्यक्ति दुभाषिया ===
उस सापेक्ष सहजता पर ध्यान दें जिसके साथ एक छोटी अभिव्यक्ति भाषा को परिभाषित और संसाधित किया जा सकता है:
उस सापेक्ष सहजता पर ध्यान दें जिसके साथ एक छोटी अभिव्यक्ति भाषा को परिभाषित और संसाधित किया जा सकता है:<syntaxhighlight lang="sml">
 
exception TyErr;
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
अपवाद टायरर;


डेटा प्रकार ty = IntTy | बूल्टी
datatype ty = IntTy | BoolTy


fun unify (Intty, Intty) = IntTy
fun unify (IntTy, IntTy) = IntTy
   | एकीकृत (बूलटी, बूलटी) = बूलटी
   | unify (BoolTy, BoolTy) = BoolTy
   | एकीकृत (_, _) = टायर बढ़ाएँ
   | unify (_, _) = raise TyErr


डेटा प्रकार ऍक्स्प
datatype exp
     = सच
     = True
     | असत्य
     | False
     | इंट ऑफ इंट
     | Int of int
     | ऍक्स्प का नहीं
     | Not of exp
     | ऍक्स्प * ऍक्स्प का जोड़
     | Add of exp * exp
     | यदि ऍक्स्प * ऍक्स्प * ऍक्स्प
     | If  of exp * exp * exp


fun infer True = बूलटी
fun infer True = BoolTy
   | अनुमान गलत = बूल्टी
   | infer False = BoolTy
   | अनुमान (इंट _) = इंटी
   | infer (Int _) = IntTy
   | अनुमान (ई नहीं) = (जोर ई बूल्टी; बूल्टी)
   | infer (Not e) = (assert e BoolTy; BoolTy)
   | अनुमान (जोड़ें (, बी)) = (एक intty जोर दें; बी intty जोर दें; intty)
   | infer (Add (a, b)) = (assert a IntTy; assert b IntTy; IntTy)
   | अनुमान (यदि (, टी, एफ)) = (जोर ई बूल्टी; एकीकृत (अनुमान टी, अनुमान एफ))
   | infer (If (e, t, f)) = (assert e BoolTy; unify (infer t, infer f))
और जोर दे टी = एकजुट (अनुमान ई, टी)
and assert e t = unify (infer e, t)


fun eval True = True
fun eval True = True
   | eval झूठा = झूठा
   | eval False = False
   | eval (इंट एन) = इंट एन
   | eval (Int n) = Int n
   | eval (नहीं ई) = अगर eval = सच है तो गलत और सच है
   | eval (Not e) = if eval e = True then False else True
   | eval (Add (a, b)) = (केस (eval a, eval b) of (Int x, Int y) => Int (x + y))
   | eval (Add (a, b)) = (case (eval a, eval b) of (Int x, Int y) => Int (x + y))
   | eval (यदि (e, t, f)) = eval (यदि eval e = True तो t और f)
   | eval (If (e, t, f)) = eval (if eval e = True then t else f)
 
fun run e = (infer e; SOME (eval e)) हैंडल TyErr => कोई नहीं
</वाक्यविन्यास हाइलाइट>


अच्छी तरह से टाइप किए गए और खराब टाइप किए गए भावों पर उदाहरण का उपयोग:
fun run e = (infer e; SOME (eval e)) handle TyErr => NONE
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
</syntaxhighlight>अच्छी तरह से टाइप किए गए और खराब टाइप किए गए भावों पर उदाहरण का उपयोग:<syntaxhighlight lang="sml">
वैल कुछ (इंट 3) = रन (जोड़ें (इंट 1, इंट 2)) (* अच्छी तरह से टाइप किया हुआ *)
val SOME (Int 3) = run (Add (Int 1, Int 2)) (* well-typed *)
वैल कोई नहीं = रन (यदि (नहीं (इंट 1), सही, गलत)) (* खराब टाइप किया हुआ *)
val NONE = run (If (Not (Int 1), True, False)) (* ill-typed *)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>'''मनमानी-परिशुद्धता पूर्णांक'''


=== मनमाना-सटीक पूर्णांक === {{code|IntInf}} }} मॉड्यूल मनमाना-सटीक पूर्णांक अंकगणितीय प्रदान करता है। इसके अलावा, पूर्णांक अक्षर का उपयोग प्रोग्रामर के बिना कुछ भी करने के लिए मनमाने ढंग से सटीक पूर्णांक के रूप में किया जा सकता है।
मॉड्यूल मनमाना-सटीक पूर्णांक अंकगणितीय प्रदान करता है। इसके अलावा, पूर्णांक अक्षर का उपयोग प्रोग्रामर के बिना कुछ भी करने के लिए मनमाने ढंग से सटीक पूर्णांक के रूप में किया जा सकता है।


निम्नलिखित कार्यक्रम एक मनमाना-सटीक तथ्यात्मक कार्य लागू करता है:
निम्नलिखित कार्यक्रम एक मनमाना-सटीक तथ्यात्मक कार्य लागू करता है:
Line 493: Line 408:
</syntaxhighlight>
</syntaxhighlight>
|}
|}


=== आंशिक आवेदन ===
=== आंशिक आवेदन ===
करीबी कार्यों में कई अनुप्रयोग होते हैं, जैसे अनावश्यक कोड को समाप्त करना। उदाहरण के लिए, एक मॉड्यूल को प्रकार के कार्यों की आवश्यकता हो सकती है {{code|lang=sml|a -> b}}, लेकिन प्रकार के कार्यों को लिखना अधिक सुविधाजनक है {{code|lang=sml|a * c -> b}} जहां प्रकार की वस्तुओं के बीच एक निश्चित संबंध होता है {{code|a}} और {{code|c}}. प्रकार का एक कार्य {{code|lang=sml|c -> (a * c -> b) -> a -> b}} इस समानता को कारक बना सकते हैं। यह [[अनुकूलक पैटर्न]] का एक उदाहरण है।{{Citation needed|date=May 2015}}
करीबी कार्यों में कई अनुप्रयोग होते हैं, जैसे अनावश्यक कोड को समाप्त करना। उदाहरण के लिए, एक मॉड्यूल को प्रकार के कार्यों की आवश्यकता हो सकती है {{code|lang=sml|a -> b}}, लेकिन प्रकार के कार्यों को लिखना अधिक सुविधाजनक है {{code|lang=sml|a * c -> b}} जहां प्रकार की वस्तुओं के बीच एक निश्चित संबंध होता है {{code|a}} और {{code|c}}. प्रकार का एक कार्य {{code|lang=sml|c -> (a * c -> b) -> a -> b}} इस समानता को कारक बना सकते हैं। यह [[अनुकूलक पैटर्न]] का एक उदाहरण है।
इस उदाहरण में, {{code|lang=sml|fun d}} किसी दिए गए फ़ंक्शन के संख्यात्मक व्युत्पन्न की गणना करता है {{code|f}} बिंदु पर {{code|x}}:
इस उदाहरण में, {{code|lang=sml|fun d}} {{code|f}} बिंदु पर {{code|x}}: किसी दिए गए फ़ंक्शन के संख्यात्मक व्युत्पन्न की गणना करता है<syntaxhighlight lang="sml">
 
- fun d delta f x = (f (x + delta) - f (x - delta)) / (2.0 * delta)
<वाक्यविन्यास लैंग = एसएमएल हाइलाइट = 1>
val d = fn : real -> (real -> real) -> real -> real
- फन डी डेल्टा एफ एक्स = (एफ (एक्स + डेल्टा) - एफ (एक्स - डेल्टा)) / (2.0 * डेल्टा)
</syntaxhighlight>के जैसा {{code|lang=sml|fun d}} इंगित करता है कि यह प्रकार के साथ एक फ़ंक्शन पर फ़्लोट को मैप करता है {{code|lang=sml|(real -> real) -> real -> real}}. यह हमें तर्कों को आंशिक रूप से लागू करने की अनुमति देता है, जिसे [[करी]]ंग के रूप में जाना जाता है। इस मामले में कार्य करें {{code|d}} आंशिक रूप से इसे तर्क के साथ लागू करके विशेषीकृत किया जा सकता है {{code|delta}}. के लिए अच्छा विकल्प है {{code|delta}} इस एल्गोरिथ्म का उपयोग करते समय [[मशीन एप्सिलॉन]] का घनमूल होता है।<syntaxhighlight lang="sml">
वैल डी = एफएन: वास्तविक -> (वास्तविक -> वास्तविक) -> वास्तविक -> वास्तविक
- val d' = d 1E~8;
</वाक्यविन्यास हाइलाइट>
val d' = fn : (real -> real) -> real -> real
 
</syntaxhighlight>ध्यान दें कि अनुमानित प्रकार इंगित करता है कि {{code|d'}} प्रकार के साथ एक समारोह की अपेक्षा करता है {{code|lang=sml|real -> real}} इसके पहले तर्क के रूप में। हम के व्युत्पन्न के लिए एक सन्निकटन की गणना कर सकते हैं <math>f(x) = x^3-x-1</math> पर <math>x=3</math>. सही उत्तर है <math>f'(3) = 27-1 = 26</math>.<syntaxhighlight lang="sml">
के जैसा {{code|lang=sml|fun d}} इंगित करता है कि यह प्रकार के साथ एक फ़ंक्शन पर फ़्लोट को मैप करता है {{code|lang=sml|(real -> real) -> real -> real}}. यह हमें तर्कों को आंशिक रूप से लागू करने की अनुमति देता है, जिसे [[करी]]ंग के रूप में जाना जाता है। इस मामले में कार्य करें {{code|d}} आंशिक रूप से इसे तर्क के साथ लागू करके विशेषीकृत किया जा सकता है {{code|delta}}. के लिए अच्छा विकल्प है {{code|delta}} इस एल्गोरिथ्म का उपयोग करते समय [[मशीन एप्सिलॉन]] का घनमूल होता है।{{Citation needed|date=August 2008}}
- d' (fn x => x * x * x - x - 1.0) 3.0;
<वाक्यविन्यास लैंग = एसएमएल हाइलाइट = 1>
val it = 25.9999996644 : real
- वैल डी '= डी 1ई ~ 8;
</syntaxhighlight>
वैल डी' = एफएन: (वास्तविक -> वास्तविक) -> वास्तविक -> वास्तविक
</वाक्यविन्यास हाइलाइट>
 
ध्यान दें कि अनुमानित प्रकार इंगित करता है कि {{code|d'}} प्रकार के साथ एक समारोह की अपेक्षा करता है {{code|lang=sml|real -> real}} इसके पहले तर्क के रूप में। हम के व्युत्पन्न के लिए एक सन्निकटन की गणना कर सकते हैं <math>f(x) = x^3-x-1</math> पर <math>x=3</math>. सही उत्तर है <math>f'(3) = 27-1 = 26</math>.
 
<वाक्यविन्यास लैंग = एसएमएल हाइलाइट = 1>
- डी' (एफएन एक्स => एक्स * एक्स * एक्स - एक्स - 1.0) 3.0;
वैल यह = 25.9999996644 : असली
</वाक्यविन्यास हाइलाइट>


== पुस्तकालय ==
== पुस्तकालय ==


=== मानक ===
=== मानक ===
द बेसिस लाइब्रेरी<ref>{{Cite web|title=Standard ML Basis Library|url=https://smlfamily.github.io/Basis/index.html|access-date=2022-01-10|website=smlfamily.github.io}}</ref> मानकीकृत किया गया है और अधिकांश कार्यान्वयन के साथ जहाज। यह पेड़ों, सरणियों और अन्य डेटा संरचनाओं के साथ-साथ इनपुट/आउटपुट और सिस्टम इंटरफेस के लिए मॉड्यूल प्रदान करता है।
द बेसिस लाइब्रेरी<ref>{{Cite web|title=Standard ML Basis Library|url=https://smlfamily.github.io/Basis/index.html|access-date=2022-01-10|website=smlfamily.github.io}}</ref> मानकीकृत किया गया है और अधिकांश कार्यान्वयन के साथ जहाज। यह ट्री, सरणियों और अन्य डेटा संरचनाओं के साथ-साथ इनपुट/आउटपुट और सिस्टम इंटरफेस के लिए मॉड्यूल प्रदान करता है।


===तीसरा पक्ष===
===तीसरा पक्ष===
Line 528: Line 433:


== कार्यान्वयन ==
== कार्यान्वयन ==
मानक एमएल के कार्यान्वयन में निम्नलिखित शामिल हैं:
मानक एमएल के कार्यान्वयन में निम्नलिखित सम्मिलित हैं:


मानक
मानक
* [http://www.mpi-sws.org/~rossberg/hamlet/ HaMLet]: एक मानक एमएल दुभाषिया जिसका उद्देश्य मानक का सटीक और सुलभ संदर्भ कार्यान्वयन होना है
* [http://www.mpi-sws.org/~rossberg/hamlet/ HaMLet]: एक मानक एमएल दुभाषिया जिसका उद्देश्य मानक का सटीक और सुलभ संदर्भ कार्यान्वयन होना है।
* [[MLton]] ([http://www.mlton.org mlton.org]): एक [[इंटरप्रोसेरल अनुकूलन]]|पूरे-प्रोग्राम ऑप्टिमाइज़िंग कंपाइलर जो कड़ाई से परिभाषा के अनुरूप है और कंपाइलर#बैक एंड सहित अन्य एमएल कार्यान्वयनों की तुलना में बहुत तेज़ कोड उत्पन्न करता है [[एलएलवीएम]] और सी के लिए
* [[MLton]] ([http://www.mlton.org mlton.org]): एक [[इंटरप्रोसेरल अनुकूलन]]|पूरे-प्रोग्राम ऑप्टिमाइज़िंग कंपाइलर जो कड़ाई से परिभाषा के अनुरूप है और कंपाइलर#बैक एंड सहित अन्य एमएल कार्यान्वयनों की तुलना में बहुत तेज़ कोड उत्पन्न करता है [[एलएलवीएम]] और सी के लिए।
* [http://www.itu.dk/people/sestoft/mosml.html मास्को एमएल]: [[कैमल]] रनटाइम इंजन पर आधारित एक हल्का कार्यान्वयन, जो मॉड्यूल और अधिकांश आधार सहित पूर्ण मानक एमएल भाषा को लागू करता है पुस्तकालय
* [http://www.itu.dk/people/sestoft/mosml.html मास्को एमएल]: [[कैमल]] रनटाइम इंजन पर आधारित एक हल्का कार्यान्वयन, जो मॉड्यूल और अधिकांश आधार सहित पूर्ण मानक एमएल भाषा को लागू करता है पुस्तकालय।
* [http://www.polyml.org/ Poly/ML]: मानक एमएल का एक पूर्ण कार्यान्वयन जो फास्ट कोड बनाता है और मल्टीकोर हार्डवेयर (पॉज़िक्स थ्रेड्स के माध्यम से) का समर्थन करता है; इसका रनटाइम सिस्टम समानांतर कचरा संग्रहण और अपरिवर्तनीय उप-संरचनाओं का ऑनलाइन साझाकरण करता है।
* [http://www.polyml.org/ Poly/ML]: मानक एमएल का एक पूर्ण कार्यान्वयन जो फास्ट कोड बनाता है और मल्टीकोर हार्डवेयर (पॉज़िक्स थ्रेड्स के माध्यम से) का समर्थन करता है; इसका रनटाइम सिस्टम समानांतर कचरा संग्रहण और अपरिवर्तनीय उप-संरचनाओं का ऑनलाइन साझाकरण करता है।
* [[न्यू जर्सी के मानक एमएल]] ([http://www.smlnj.org/ smlnj.org]): एक पूर्ण संकलक, संबंधित पुस्तकालयों, उपकरणों, एक इंटरैक्टिव खोल, और [[समवर्ती एमएल]] के समर्थन के साथ दस्तावेज़ीकरण के साथ
* [[न्यू जर्सी के मानक एमएल]] ([http://www.smlnj.org/ smlnj.org]): एक पूर्ण संकलक, संबंधित पुस्तकालयों, उपकरणों, एक इंटरैक्टिव खोल, और [[समवर्ती एमएल]] के समर्थन के साथ दस्तावेज़ीकरण के साथ।
* [http://www.cl.cam.ac.uk/Research/TSG/SMLNET/ SML.NET]: अन्य .NET Framework|.NET कोड के साथ जोड़ने के लिए एक्सटेंशन के साथ [[सामान्य भाषा रनटाइम]] के लिए एक मानक एमएल कंपाइलर
* [http://www.cl.cam.ac.uk/Research/TSG/SMLNET/ SML.NET]: अन्य .NET Framework|.NET कोड के साथ जोड़ने के लिए एक्सटेंशन के साथ [[सामान्य भाषा रनटाइम]] के लिए एक मानक एमएल कंपाइलर।
* [http://www.elsman.com/mlkit/ एमएल किट] {{Webarchive|url=https://web.archive.org/web/20160107005413/http://www.elsman.com/mlkit/ |date=2016-01-07 }}: वास्तविक समय के अनुप्रयोगों का समर्थन करने के उद्देश्य से एक कचरा संग्राहक (जिसे अक्षम किया जा सकता है) और क्षेत्रों के स्वत: अनुमान के साथ क्षेत्र-आधारित मेमोरी प्रबंधन को एकीकृत करते हुए परिभाषा पर बहुत बारीकी से आधारित कार्यान्वयन
* [http://www.elsman.com/mlkit/ एमएल किट] {{Webarchive|url=https://web.archive.org/web/20160107005413/http://www.elsman.com/mlkit/ |date=2016-01-07 }}: वास्तविक समय के अनुप्रयोगों का समर्थन करने के उद्देश्य से एक कचरा संग्राहक (जिसे अक्षम किया जा सकता है) और क्षेत्रों के स्वत: अनुमान के साथ क्षेत्र-आधारित मेमोरी प्रबंधन को एकीकृत करते हुए परिभाषा पर बहुत बारीकी से आधारित कार्यान्वयन।


यौगिक
डेरिवेटिव
* [[ऐलिस (प्रोग्रामिंग भाषा)]]: फ्यूचर्स और वादों, [[आलसी मूल्यांकन]], दूरस्थ प्रक्रिया कॉल और [[बाधा प्रोग्रामिंग]] के माध्यम से वितरित कंप्यूटिंग के समर्थन के साथ सारलैंड विश्वविद्यालय द्वारा मानक एमएल के लिए एक दुभाषिया
* [[ऐलिस (प्रोग्रामिंग भाषा)]]: फ्यूचर्स और वादों, [[आलसी मूल्यांकन]], दूरस्थ प्रक्रिया कॉल और [[बाधा प्रोग्रामिंग]] के माध्यम से वितरित कंप्यूटिंग के समर्थन के साथ सारलैंड विश्वविद्यालय द्वारा मानक एमएल के लिए एक दुभाषिया।
* [http://www.pllab.riec.tohoku.ac.jp/smlsharp/ SML#]: रिकॉर्ड बहुरूपता और C भाषा इंटरऑपरेबिलिटी प्रदान करने वाले SML का विस्तार। यह एक पारंपरिक नेटिव कंपाइलर है और इसका नाम ''नहीं'' है जो .NET फ्रेमवर्क पर चलने का संकेत है
* [http://www.pllab.riec.tohoku.ac.jp/smlsharp/ SML#]: रिकॉर्ड बहुरूपता और C भाषा इंटरऑपरेबिलिटी प्रदान करने वाले एसएमएल का विस्तार। यह एक पारंपरिक नेटिव कंपाइलर है और इसका नाम ''not'' है जो .NET फ्रेमवर्क पर चलने का संकेत है।
* [https://github.com/SOSML/SOSML SOSML]: [[टाइपप्रति]] में लिखा गया एक कार्यान्वयन, अधिकांश एसएमएल भाषा का समर्थन करता है और आधार पुस्तकालय के कुछ हिस्सों का चयन करता है
* [https://github.com/SOSML/SOSML SOSML]: [[टाइपप्रति]] में लिखा गया एक कार्यान्वयन, अधिकांश एसएमएल भाषा का समर्थन करता है और आधार पुस्तकालय के कुछ हिस्सों का चयन करता है।


शोध करना
शोध करना
* [https://cakeml.org/ CakeML] औपचारिक रूप से सत्यापित रनटाइम और असेंबलर के लिए अनुवाद के साथ ML का REPL संस्करण है।
* [https://cakeml.org/ CakeML] औपचारिक रूप से सत्यापित रनटाइम और असेंबलर के लिए अनुवाद के साथ एमएल का आरईपीएल संस्करण है।
* [[इसाबेल (सबूत सहायक)]] ([http://isabelle.in.tum.de इसाबेल/एमएल]) आधिकारिक मानक एमएल (एसएमएल) के लिए एक परिष्कृत आईडीई ([[जे संपादित करें]] पर आधारित) के साथ एक इंटरैक्टिव प्रमेय प्रोवर में समानांतर पॉली/एमएल को एकीकृत करता है। '97), इसाबेल/एमएल बोली, और प्रमाण भाषा। इसाबेल2016 से शुरू होकर, एमएल के लिए एक स्रोत-स्तरीय डिबगर भी है।
* [[इसाबेल (सबूत सहायक)]] ([http://isabelle.in.tum.de इसाबेल/एमएल]) आधिकारिक मानक एमएल (एसएमएल) के लिए एक परिष्कृत आईडीई ([[जे संपादित करें]] पर आधारित) के साथ एक इंटरैक्टिव प्रमेय प्रोवर में समानांतर पॉली/एमएल को एकीकृत करता है। '97), इसाबेल/एमएल बोली, और प्रमाण भाषा। इसाबेल2016 से प्रारम्भ होकर, एमएल के लिए एक स्रोत-स्तरीय डिबगर भी है।
* [[फर्श का प्रावरण]] [[सामान्य लिस्प]] और [[प्रोलॉग]] के साथ मानक एमएल के एक संस्करण को लागू करता है, जिससे मिश्रित भाषा प्रोग्रामिंग की अनुमति मिलती है; सभी [[POP-11]] में लागू किए गए हैं, जो [[वृद्धिशील संकलक]] है।
* [[फर्श का प्रावरण|पॉपलॉग]] [[सामान्य लिस्प]] और [[प्रोलॉग]] के साथ मानक एमएल के एक संस्करण को लागू करता है, जिससे मिश्रित भाषा प्रोग्रामिंग की अनुमति मिलती है; सभी [[POP-11]] में लागू किए गए हैं, जो [[वृद्धिशील संकलक]] है।
* [http://www.cs.cornell.edu/home/jgm/tilt.html TILT] मानक एमएल के लिए एक पूर्ण प्रमाणित संकलक है जो [[कार्यक्रम अनुकूलन]] कोड में टाइप किए गए इंटरमीडिएट प्रतिनिधित्व का उपयोग करता है और शुद्धता सुनिश्चित करता है, और टाइप किए गए असेंबली को संकलित कर सकता है भाषा।
* [http://www.cs.cornell.edu/home/jgm/tilt.html TILT] मानक एमएल के लिए एक पूर्ण प्रमाणित संकलक है जो [[कार्यक्रम अनुकूलन]] कोड में टाइप किए गए इंटरमीडिएट प्रतिनिधित्व का उपयोग करता है और शुद्धता सुनिश्चित करता है, और टाइप किए गए असेंबली को संकलित कर सकता है भाषा।


ये सभी कार्यान्वयन [[ओपन-सोर्स लाइसेंस]] | ओपन-सोर्स हैं और स्वतंत्र रूप से उपलब्ध हैं। अधिकांश स्वयं मानक एमएल में लागू होते हैं। अब कोई व्यावसायिक कार्यान्वयन नहीं है; [[हार्लेक्विन (सॉफ्टवेयर कंपनी)]], जो अब निष्क्रिय है, ने एक बार MLWorks नामक एक वाणिज्यिक IDE और कंपाइलर का उत्पादन किया, जो [[Xanalys]] को दिया गया और बाद में 26 अप्रैल, 2013 को रेवेनब्रुक लिमिटेड द्वारा अधिग्रहित किए जाने के बाद इसे ओपन-सोर्स किया गया।
ये सभी कार्यान्वयन [[ओपन-सोर्स लाइसेंस]] | ओपन-सोर्स हैं और स्वतंत्र रूप से उपलब्ध हैं। अधिकांश स्वयं मानक एमएल में लागू होते हैं। अब कोई व्यावसायिक कार्यान्वयन नहीं है; [[हार्लेक्विन (सॉफ्टवेयर कंपनी)]], जो अब निष्क्रिय है, ने एक बार MLWorks नामक एक वाणिज्यिक IDE और कंपाइलर का उत्पादन किया, जो [[Xanalys]] को दिया गया और बाद में 26 अप्रैल, 2013 को रेवेनब्रुक लिमिटेड द्वारा अधिग्रहित किए जाने के बाद इसे ओपन-सोर्स किया गया है।
 
'''SML का उपयोग करने वाली प्रमुख परियोजनाएँ'''


== SML == का उपयोग करने वाली प्रमुख परियोजनाएँ
[[कोपेनहेगन के आईटी विश्वविद्यालय]] का संपूर्ण [[उद्यम स्थापत्य]] एसएमएल की लगभग 100,000 लाइनों में लागू किया गया है, जिसमें स्टाफ रिकॉर्ड, पेरोल, कोर्स एडमिनिस्ट्रेशन और फीडबैक, स्टूडेंट प्रोजेक्ट मैनेजमेंट और वेब-आधारित सेल्फ-सर्विस इंटरफेस सम्मिलित हैं।<ref name="sml" />
[[कोपेनहेगन के आईटी विश्वविद्यालय]] का संपूर्ण [[उद्यम स्थापत्य]] एसएमएल की लगभग 100,000 लाइनों में लागू किया गया है, जिसमें स्टाफ रिकॉर्ड, पेरोल, कोर्स एडमिनिस्ट्रेशन और फीडबैक, स्टूडेंट प्रोजेक्ट मैनेजमेंट और वेब-आधारित सेल्फ-सर्विस इंटरफेस शामिल हैं।<ref name="sml" />


प्रूफ असिस्टेंट एचओएल (प्रूफ असिस्टेंट), इसाबेल (प्रूफ असिस्टेंट), [[लेगो ([[सबूत सहायक]])]] और [[बारह]] स्टैंडर्ड एमएल में लिखे गए हैं। इसका उपयोग कंपाइलर # कंपाइलर निर्माण और [[एआरएम वास्तुकला]] जैसे [[एकीकृत सर्किट डिजाइन]]रों द्वारा भी किया जाता है।<ref name="machine code verification" />
प्रूफ असिस्टेंट एचओएल (प्रूफ असिस्टेंट), इसाबेल (प्रूफ असिस्टेंट), [[लेगो ([[सबूत सहायक]])]] और [[बारह]] स्टैंडर्ड एमएल में लिखे गए हैं। इसका उपयोग कंपाइलर # कंपाइलर निर्माण और [[एआरएम वास्तुकला]] जैसे [[एकीकृत सर्किट डिजाइन]]रों द्वारा भी किया जाता है।<ref name="machine code verification" />


 
यह भी देखें
== यह भी देखें ==
* [[घोषणात्मक प्रोग्रामिंग]]
* [[घोषणात्मक प्रोग्रामिंग]]


Line 627: Line 532:
  }}</ref>
  }}</ref>
}}
}}


==बाहरी संबंध==
==बाहरी संबंध==
Line 650: Line 554:
{{Programming languages}}
{{Programming languages}}
{{Authority control}}
{{Authority control}}
[[Category: एमएल प्रोग्रामिंग भाषा परिवार]] [[Category: कार्यात्मक भाषाएँ]] [[Category: प्रक्रियात्मक प्रोग्रामिंग भाषाएँ]] [[Category: 1990 में बनाई गई प्रोग्रामिंग लैंग्वेज]]


[[Category: Machine Translated Page]]
[[Category:1990 में बनाई गई प्रोग्रामिंग लैंग्वेज]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Collapse templates]]
[[Category:Created On 18/02/2023]]
[[Category:Created On 18/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia metatemplates]]
[[Category:एमएल प्रोग्रामिंग भाषा परिवार]]
[[Category:कार्यात्मक भाषाएँ]]
[[Category:प्रक्रियात्मक प्रोग्रामिंग भाषाएँ]]

Latest revision as of 17:28, 4 September 2023

Standard ML
ParadigmMulti-paradigm: functional, imperative, modular[1]
परिवारML
पहली प्रस्तुति1983; 43 years ago (1983)[2]
Stable release
Standard ML '97[2] / 1997; 29 years ago (1997)
टाइपिंग अनुशासनInferred, static, strong
फ़ाइल नाम एक्सटेंशनएस.sml
Major implementations
SML/NJ, MLton
Dialects
Alice, Concurrent ML, Dependent ML
Influenced by
ML, Hope, Pascal
Influenced
Elm, F#, F*, Haskell, OCaml, Python,[3] Rust, Scala

मानक एमएल (स्टैण्डर्ड एमएल-एसएमएल) सामान्य प्रयोजन, मॉड्यूलर, कार्यात्मक प्रोग्रामिंग भाषा है जिसमें संकलन-समय प्रकार की जाँच और प्रकार का अनुमान है। यह संकलक लेखकों और प्रोग्रामिंग भाषा शोधकर्ताओं के साथ-साथ प्रमेय सिद्ध करने वालों के विकास में लोकप्रिय है।

मानक एमएल एमएल की एक आधुनिक बोली है, जो लॉजिक फॉर कंप्यूटेबल फंक्शंस (एलसीएफ) प्रमेय-सिद्ध परियोजना में उपयोग की जाने वाली भाषा है। यह व्यापक रूप से उपयोग की जाने वाली भाषाओं के बीच विशिष्ट है, इसमें एक औपचारिक विनिर्देश है, जिसे मानक की परिभाषा एमएल में टाइपिंग नियमों और परिचालन शब्दार्थ के रूप में दिया गया है।[4]

भाषा

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

कार्य

सभी कार्यात्मक भाषाओं की तरह, मानक एमएल की एक प्रमुख विशेषता कार्य है, जो अमूर्त के लिए उपयोग की जाती है। भाज्य फलन को इस प्रकार व्यक्त किया जा सकता है :

fun factorial n = 
    if n = 0 then 1 else n * factorial (n - 1)

अनुमान टाइप करें

एक एसएमएल कंपाइलर को स्थिर प्रकार का अनुमान लगाना चाहिए val factorial : int -> intउपयोगकर्ता द्वारा आपूर्ति किए गए प्रकार के एनोटेशन के बिना। यह निष्कर्ष निकाला जाना चाहिए कि एन केवल पूर्णांक अभिव्यक्तियों के साथ प्रयोग किया जाता है, और इसलिए स्वयं एक पूर्णांक होना चाहिए और सभी टर्मिनल अभिव्यक्ति पूर्णांक अभिव्यक्तियां हैं।

घोषणात्मक परिभाषाएँ

एक ही फ़ंक्शन को क्लॉज़ल फ़ंक्शन परिभाषाओं के साथ व्यक्त किया जा सकता है, जहां if-then-else सशर्त को विशिष्ट मानों के लिए मूल्यांकन किए गए फैक्टोरियल फ़ंक्शन के टेम्प्लेट से बदल दिया जाता है:

fun factorial 0 = 1
  | factorial n = n * factorial (n - 1)

अनिवार्य परिभाषाएं

fun factorial n = let val i = ref n and acc = ref 1 in
    while !i > 0 do (acc := !acc * !i; i := !i - 1); !acc
end

लैम्ब्डा कार्य

या लैम्ब्डा फ़ंक्शन के रूप में:

val rec factorial = fn 0 => 1 | n => n * factorial (n - 1)

यहाँ, कीवर्ड val एक मूल्य के लिए एक पहचानकर्ता के बंधन का परिचय देता है, fn एक अनाम फ़ंक्शन का परिचय देता है, और rec परिभाषा को स्व-संदर्भित करने की अनुमति देता है।

स्थानीय परिभाषाएं

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

स्थानीय फ़ंक्शन का उपयोग करके, इसे अधिक कुशल पूंछ-पुनरावर्ती शैली में फिर से लिखा जा सकता है:

local
    fun loop (0, acc) = acc
      | loop (m, acc) = loop (m - 1, m * acc)
in
    fun factorial n = loop (n, 1)
end

समानार्थी शब्द टाइप करें

एक प्रकार के समानार्थी को कीवर्ड के साथ परिभाषित किया गया है type. यहाँ एक समतल (ज्यामिति) पर बिंदुओं के लिए एक प्रकार का पर्यायवाची है, और दो बिंदुओं के बीच की दूरी की गणना करने वाले कार्य, और हेरोन के सूत्र के अनुसार दिए गए कोनों के साथ एक त्रिभुज का क्षेत्रफल। (इन परिभाषाओं का उपयोग बाद के उदाहरणों में किया जाएगा)।

type loc = real * real

fun square (x : real) = x * x

fun dist (x, y) (x', y') =
    Math.sqrt (square (x' - x) + square (y' - y))

fun heron (a, b, c) = let
    val x = dist a b
    val y = dist b c
    val z = dist a c
    val s = (x + y + z) / 2.0
    in
        Math.sqrt (s * (s - x) * (s - y) * (s - z))
    end

बीजगणितीय डेटा प्रकार

मानक एमएल बीजगणितीय डेटाटाइप्स (एडीटी) के लिए मजबूत समर्थन प्रदान करता है। एक डेटाटाइप को टुपल्स (या उत्पादों की राशि) के एक अलग संघ के रूप में माना जा सकता है। वे परिभाषित करने में आसान हैं और उपयोग में आसान हैं, मोटे तौर पर पैटर्न मिलान के साथ-साथ अधिकांश मानक एमएल कार्यान्वयन 'आंशिक कार्य | पैटर्न-निकासता की जाँच और पैटर्न अतिरेक जाँच के कारण।

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

एक डेटाटाइप को कीवर्ड के साथ परिभाषित किया गया है datatype, के रूप में:

datatype shape
    = Circle   of loc * real      (* center and radius *)
    | Square   of loc * real      (* upper-left corner and side length; axis-aligned *)
    | Triangle of loc * loc * loc (* corners *)

ध्यान दें कि एक प्रकार का समानार्थी पुनरावर्ती नहीं हो सकता है; रिकर्सिव कन्स्ट्रक्टर को परिभाषित करने के लिए डेटाटाइप आवश्यक हैं। (यह इस उदाहरण में मुद्दा नहीं है।)

पैटर्न मिलान

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

फ़ंक्शन तर्कों को निम्नानुसार पैटर्न के रूप में परिभाषित किया जा सकता है:

fun area (Circle (_, r)) = Math.pi * square r
  | area (Square (_, s)) = square s
  | area (Triangle p) = heron p (* see above *)

फ़ंक्शन परिभाषा का तथाकथित क्लॉसल रूप, जहां तर्कों को पैटर्न के रूप में परिभाषित किया जाता है, केस एक्सप्रेशन के लिए केवल सिंटैक्टिक चीनी है:

fun area shape = case shape of
    Circle (_, r) => Math.pi * square r
  | Square (_, s) => square s
  | Triangle p => heron p

संपूर्णता जाँच

पैटर्न-विस्तृतता जांच सुनिश्चित करेगी कि डेटाटाइप के प्रत्येक कन्स्ट्रक्टर कम से कम एक पैटर्न से मेल खाते हैं।

निम्नलिखित पैटर्न संपूर्ण नहीं है:

fun center (Circle (c, _)) = c
  | center (Square ((x, y), s)) = (x + s / 2.0, y + s / 2.0)

के लिए कोई पैटर्न नहीं है Triangle मामले में center समारोह। कंपाइलर एक चेतावनी जारी करेगा कि केस एक्सप्रेशन संपूर्ण नहीं है, और यदि a Triangle रनटाइम पर इस फ़ंक्शन को पास किया जाता है, exception Match उठाया जाएगा।

अतिरेक जाँच

पैटर्न निम्नलिखित (अर्थहीन) फ़ंक्शन के दूसरे खंड में अनावश्यक है:

fun f (Circle ((x, y), r)) = x + y
  | f (Circle _) = 1.0
  | f _ = 0.0

कोई भी मान जो दूसरे क्लॉज में पैटर्न से मेल खाता है, पहले क्लॉज के पैटर्न से भी मेल खाएगा, इसलिए दूसरा क्लॉज अप्राप्य है। इसलिए, यह परिभाषा पूर्ण अतिरेक प्रदर्शित करती है और संकलन-समय की चेतावनी देती है। निम्नलिखित फ़ंक्शन परिभाषा संपूर्ण है और अनावश्यक नहीं है:

val hasCorners = fn (Circle _) => false | _ => true

यदि नियंत्रण पहले पैटर्न से आगे निकल जाता है (Circle), हम जानते हैं कि आकार या तो होना चाहिए Square या ए Triangle. इनमें से किसी भी स्थिति में, हम जानते हैं कि आकृति के कोने हैं, इसलिए हम वापस लौट सकते हैं true वास्तविक स्वरूप को जाने बिना।

उच्च-क्रम के कार्य

कार्य तर्कों के रूप में कार्यों का उपभोग कर सकते हैं:

fun map f (x, y) = (f x, f y)

कार्य वापसी मूल्यों के रूप में कार्यों का उत्पादन कर सकते हैं:

fun constant k = (fn _ => k)

कार्य भी कार्यों का उपभोग और उत्पादन दोनों कर सकते हैं:

fun compose (f, g) = (fn x => f (g x))

कार्यक्रम List.map आधार पुस्तकालय से मानक एमएल में सबसे अधिक उपयोग किए जाने वाले उच्च-क्रम के कार्यों में से एक है

fun map _ [] = []
  | map f (x :: xs) = f x :: map f xs

पूंछ-पुनरावर्ती के साथ एक अधिक कुशल कार्यान्वयन List.foldl:

fun map f = List.rev o List.foldl (fn (x, acc) => f x :: acc) []

अपवाद

अपवाद कीवर्ड के साथ उठाए जाते हैं raise और पैटर्न मिलान के साथ संभाला handle निर्माण। अपवाद प्रणाली गैर-स्थानीय निकास को लागू कर सकती है; यह अनुकूलन तकनीक निम्नलिखित जैसे कार्यों के लिए उपयुक्त है।

local
    exception Zero;
    val p = fn (0, _) => raise Zero | (a, b) => a * b
in
    fun prod xs = List.foldl p 1 xs handle Zero => 0
end

कब exception Zero उठाया जाता है, नियंत्रण कार्य छोड़ देता है List.foldl कुल मिलाकर। विकल्प पर विचार करें: मान 0 लौटाया जाएगा, इसे सूची में अगले पूर्णांक से गुणा किया जाएगा, परिणामी मान (अनिवार्य रूप से 0) वापस किया जाएगा, और इसी तरह। अपवाद को बढ़ाने से फ्रेम की पूरी श्रृंखला को छोड़ने और संबंधित संगणना से बचने के लिए नियंत्रण की अनुमति मिलती है। अंडरस्कोर के उपयोग पर ध्यान दें (_) वाइल्डकार्ड पैटर्न के रूप में। टेल कॉल के साथ समान अनुकूलन प्राप्त किया जा सकता है।

local
    fun p a (0 :: _) = 0
      | p a (x :: xs) = p (a * x) xs
      | p a [] = a
in
    val prod = p 1
end

मॉड्यूल सिस्टम

मानक एमएल की उन्नत मॉड्यूल प्रणाली कार्यक्रमों को तार्किक रूप से संबंधित प्रकार और मूल्य परिभाषाओं के पदानुक्रमित संगठित संरचनाओं में विघटित करने की अनुमति देती है। मॉड्यूल न केवल नामस्थान नियंत्रण प्रदान करते हैं बल्कि अमूर्तता भी प्रदान करते हैं, इस अर्थ में कि वे सार डेटा प्रकार की परिभाषा की अनुमति देते हैं। तीन मुख्य सिंटैक्टिक संरचनाओं में मॉड्यूल सिस्टम सम्मिलित है: हस्ताक्षर, संरचनाएं और फ़ैक्टर।

हस्ताक्षर

एक हस्ताक्षर एक इंटरफ़ेस (कंप्यूटर विज्ञान) है, जिसे सामान्यतः संरचना के लिए एक प्रकार के रूप में माना जाता है; यह संरचना द्वारा प्रदान की गई सभी संस्थाओं के नाम के साथ-साथ प्रत्येक प्रकार के घटक, प्रत्येक मूल्य घटक के प्रकार और प्रत्येक उपसंरचना के हस्ताक्षर को निर्दिष्ट करता है। प्रकार के घटकों की परिभाषाएँ वैकल्पिक हैं; प्रकार के घटक जिनकी परिभाषाएँ छिपी हुई हैं वे सार प्रकार हैं।

उदाहरण के लिए, कतार (डेटा संरचना) के लिए हस्ताक्षर हो सकते हैं:

signature QUEUE = sig
    type 'a queue
    exception QueueError;
    val empty     : 'a queue
    val isEmpty   : 'a queue -> bool
    val singleton : 'a -> 'a queue
    val fromList  : 'a list -> 'a queue
    val insert    : 'a * 'a queue -> 'a queue
    val peek      : 'a queue -> 'a
    val remove    : 'a queue -> 'a * 'a queue
end

यह हस्ताक्षर एक मॉड्यूल का वर्णन करता है जो बहुरूपी प्रकार प्रदान करता है 'a queue, exception QueueError, और मान जो कतारों पर बुनियादी संचालन को परिभाषित करते हैं।

संरचनाएं

एक स्ट्रक्चर एक मॉड्यूल है; इसमें एक तार्किक इकाई में एक साथ पैक किए गए प्रकारों, अपवादों, मूल्यों और संरचनाओं (सबस्ट्रक्चर कहा जाता है) का एक संग्रह होता है।

एक कतार संरचना को निम्नानुसार कार्यान्वित किया जा सकता है:

structure TwoListQueue :> QUEUE = struct
    type 'a queue = 'a list * 'a list

    exception QueueError;

    val empty = ([], [])

    fun isEmpty ([], []) = true
      | isEmpty _ = false

    fun singleton a = ([], [a])

    fun fromList a = ([], a)

    fun insert (a, ([], [])) = singleton a
      | insert (a, (ins, outs)) = (a :: ins, outs)

    fun peek (_, []) = raise QueueError
      | peek (ins, outs) = List.hd outs

    fun remove (_, []) = raise QueueError
      | remove (ins, [a]) = (a, ([], List.rev ins))
      | remove (ins, a :: outs) = (a, (ins, outs))
end

यह परिभाषा इसकी घोषणा करती है structure TwoListQueue औजार signature QUEUE. इसके अलावा, अपारदर्शी शिलालेख द्वारा निरूपित :> बताता है कि कोई भी प्रकार जो हस्ताक्षर में परिभाषित नहीं है (अर्थात type 'a queue) अमूर्त होना चाहिए, जिसका अर्थ है कि सूची की एक जोड़ी के रूप में कतार की परिभाषा मॉड्यूल के बाहर दिखाई नहीं दे रही है। संरचना हस्ताक्षर में सभी परिभाषाओं को लागू करती है। संरचना में प्रकार और मूल्यों को डॉट नोटेशन के साथ एक्सेस किया जा सकता है:

val q : string TwoListQueue.queue = TwoListQueue.empty
val q' = TwoListQueue.insert (Real.toString Math.pi, q)

फंक्टर्स

एक फ़ैक्टर संरचनाओं से संरचनाओं का एक कार्य है; अर्थात्, एक मज़ेदार एक या एक से अधिक तर्कों को स्वीकार करता है, जो सामान्यतः दिए गए हस्ताक्षर की संरचनाएं होती हैं, और इसके परिणाम के रूप में संरचना उत्पन्न करती हैं। सामान्य प्रोग्रामिंग डेटा संरचनाओं और एल्गोरिदम को लागू करने के लिए फ़ंक्टर्स का उपयोग किया जाता है।

एक लोकप्रिय एल्गोरिदम[5] ट्री की चौड़ाई-पहले खोज के लिए कतारों का उपयोग किया जाता है। यहाँ हम उस एल्गोरिथम का एक संस्करण प्रस्तुत करते हैं जो एक अमूर्त कतार संरचना पर परिचालित होता है:

(* after Okasaki, ICFP, 2000 *)
functor BFS (Q: QUEUE) = struct
  datatype 'a tree = E | T of 'a * 'a tree * 'a tree

  local
    fun bfsQ q = if Q.isEmpty q then [] else search (Q.remove q)
    and search (E, q) = bfsQ q
      | search (T (x, l, r), q) = x :: bfsQ (insert (insert q l) r)
    and insert q a = Q.insert (a, q)
  in
    fun bfs t = bfsQ (Q.singleton t)
  end
end

structure QueueBFS = BFS (TwoListQueue)

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

कोड उदाहरण

एसएमएल कोड के स्निपेट्स को रीड–इवल–प्रिंट लूप|इंटरएक्टिव टॉप-लेवल में डालकर सबसे आसानी से अध्ययन किया जाता है।

हैलो वर्ल्ड

निम्नलिखित एक हैलो, दुनिया है! कार्यक्रम:

hello.sml
print "Hello, world!\n"
bash
$ mlton hello.sml
$ ./hello
Hello, world!

एल्गोरिदम

सम्मिलन क्रम

के लिए निवेशन छँटाई int list (आरोही) संक्षेप में निम्नानुसार व्यक्त किया जा सकता है:

fun insert (x, []) = [x] | insert (x, h :: t) = sort x (h, t)
and sort x (h, t) = if x < h then [x, h] @ t else h :: insert (x, t)
val insertionsort = List.foldl insert []

मर्जसॉर्ट

यहां, क्लासिक मर्जसॉर्ट एल्गोरिथ्म को तीन कार्यों में लागू किया गया है: स्प्लिट, मर्ज और मर्जसॉर्ट। सिंटैक्स के अपवाद के साथ, प्रकारों की अनुपस्थिति पर भी ध्यान दें op :: और [] जो सूचियों को दर्शाता है। यह कोड किसी भी प्रकार की सूचियों को सॉर्ट करेगा, जब तक कि एक सुसंगत ऑर्डरिंग फ़ंक्शन cmp परिभाषित किया गया। हिंडले-मिलनर प्रकार के अनुमान का उपयोग करके, सभी चर के प्रकारों का अनुमान लगाया जा सकता है,

यहाँ cmp कार्यों जैसे जटिल प्रकारों को भी विभाजित करता है

fun split एक राज्य (कंप्यूटर विज्ञान) क्लोजर के साथ लागू किया जाता है, जो बीच में वैकल्पिक होता है true और false, इनपुट की अनदेखी:

fun alternator {} = let val state = ref true
    in fn a => !state before state := not (!state) end

(* Split a list into near-halves which will either be the same length,
 * or the first will have one more element than the other.
 * Runs in O(n) time, where n = |xs|.
 *)
fun split xs = List.partition (alternator {}) xs

मर्ज (विलय)

दक्षता के लिए विलय स्थानीय फ़ंक्शन लूप का उपयोग करता है। भीतरी loop मामलों के संदर्भ में परिभाषित किया गया है: जब दोनों सूचियाँ खाली नहीं हैं (x :: xs) और जब एक सूची खाली हो ([]).

यह फ़ंक्शन दो क्रमबद्ध सूचियों को एक क्रमबद्ध सूची में मिला देता है। ध्यान दें कि कैसे संचायक acc पीछे की ओर बनाया जाता है, फिर लौटाए जाने से पहले उलट दिया जाता है। यह एक सामान्य तकनीक है, चूंकि 'a list एक लिंक्ड सूची के रूप में दर्शाया गया है # लिंक्ड सूचियाँ बनाम डायनामिक_एरे; इस तकनीक के लिए अधिक क्लॉक टाइम की आवश्यकता होती है, लेकिन स्पर्शोन्मुख विश्लेषण अनुप्रयोग खराब नहीं होते हैं।

(* Merge two ordered lists using the order cmp.
 * Pre: each list must already be ordered per cmp.
 * Runs in O(n) time, where n = |xs| + |ys|.
 *)
fun merge cmp (xs, []) = xs
  | merge cmp (xs, y :: ys) = let
    fun loop (a, acc) (xs, []) = List.revAppend (a :: acc, xs)
      | loop (a, acc) (xs, y :: ys) =
        if cmp (a, y)
        then loop (y, a :: acc) (ys, xs)
        else loop (a, y :: acc) (xs, ys)
    in
        loop (y, []) (ys, xs)
    end

मर्ज सॉर्ट मुख्य कार्य:

fun ap f (x, y) = (f x, f y)

(* Sort a list in according to the given ordering operation cmp.
 * Runs in O(n log n) time, where n = |xs|.
 *)
fun mergesort cmp [] = []
  | mergesort cmp [x] = [x]
  | mergesort cmp xs = (merge cmp o ap (mergesort cmp) o split) xs

क्विकॉर्ट

क्विकसॉर्ट को निम्नानुसार व्यक्त किया जा सकता है। fun part एक क्लोजर (कंप्यूटर प्रोग्रामिंग) है जो ऑर्डर ऑपरेटर का उपभोग करता है op <<.

infix <<

fun quicksort (op <<) = let
    fun part p = List.partition (fn x => x << p)
    fun sort [] = []
      | sort (p :: xs) = join p (part p xs)
    and join p (l, r) = sort l @ p :: sort r
    in
        sort
    end

अभिव्यक्ति दुभाषिया

उस सापेक्ष सहजता पर ध्यान दें जिसके साथ एक छोटी अभिव्यक्ति भाषा को परिभाषित और संसाधित किया जा सकता है:

exception TyErr;

datatype ty = IntTy | BoolTy

fun unify (IntTy, IntTy) = IntTy
  | unify (BoolTy, BoolTy) = BoolTy
  | unify (_, _) = raise TyErr

datatype exp
    = True
    | False
    | Int of int
    | Not of exp
    | Add of exp * exp
    | If  of exp * exp * exp

fun infer True = BoolTy
  | infer False = BoolTy
  | infer (Int _) = IntTy
  | infer (Not e) = (assert e BoolTy; BoolTy)
  | infer (Add (a, b)) = (assert a IntTy; assert b IntTy; IntTy)
  | infer (If (e, t, f)) = (assert e BoolTy; unify (infer t, infer f))
and assert e t = unify (infer e, t)

fun eval True = True
  | eval False = False
  | eval (Int n) = Int n
  | eval (Not e) = if eval e = True then False else True
  | eval (Add (a, b)) = (case (eval a, eval b) of (Int x, Int y) => Int (x + y))
  | eval (If (e, t, f)) = eval (if eval e = True then t else f)

fun run e = (infer e; SOME (eval e)) handle TyErr => NONE

अच्छी तरह से टाइप किए गए और खराब टाइप किए गए भावों पर उदाहरण का उपयोग:

val SOME (Int 3) = run (Add (Int 1, Int 2)) (* well-typed *)
val NONE = run (If (Not (Int 1), True, False)) (* ill-typed *)

मनमानी-परिशुद्धता पूर्णांक

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

निम्नलिखित कार्यक्रम एक मनमाना-सटीक तथ्यात्मक कार्य लागू करता है:

fact.sml
fun fact n : IntInf.int = if n = 0 then 1 else n * fact (n - 1);

fun printLine str = let in
    TextIO.output (TextIO.stdOut, str);
    TextIO.output (TextIO.stdOut, "\n")
end;

val () = printLine (IntInf.toString (fact 120));
bash
$ mlton fact.sml
$ ./fact
6689502913449127057588118054090372586752746333138029810295671352301
6335572449629893668741652719849813081576378932140905525344085894081
21859898481114389650005964960521256960000000000000000000000000000

आंशिक आवेदन

करीबी कार्यों में कई अनुप्रयोग होते हैं, जैसे अनावश्यक कोड को समाप्त करना। उदाहरण के लिए, एक मॉड्यूल को प्रकार के कार्यों की आवश्यकता हो सकती है a -> b, लेकिन प्रकार के कार्यों को लिखना अधिक सुविधाजनक है a * c -> b जहां प्रकार की वस्तुओं के बीच एक निश्चित संबंध होता है a और c. प्रकार का एक कार्य c -> (a * c -> b) -> a -> b इस समानता को कारक बना सकते हैं। यह अनुकूलक पैटर्न का एक उदाहरण है।

इस उदाहरण में, fun d f बिंदु पर x: किसी दिए गए फ़ंक्शन के संख्यात्मक व्युत्पन्न की गणना करता है

- fun d delta f x = (f (x + delta) - f (x - delta)) / (2.0 * delta)
val d = fn : real -> (real -> real) -> real -> real

के जैसा fun d इंगित करता है कि यह प्रकार के साथ एक फ़ंक्शन पर फ़्लोट को मैप करता है (real -> real) -> real -> real. यह हमें तर्कों को आंशिक रूप से लागू करने की अनुमति देता है, जिसे करींग के रूप में जाना जाता है। इस मामले में कार्य करें d आंशिक रूप से इसे तर्क के साथ लागू करके विशेषीकृत किया जा सकता है delta. के लिए अच्छा विकल्प है delta इस एल्गोरिथ्म का उपयोग करते समय मशीन एप्सिलॉन का घनमूल होता है।

- val d' = d 1E~8;
val d' = fn : (real -> real) -> real -> real

ध्यान दें कि अनुमानित प्रकार इंगित करता है कि d' प्रकार के साथ एक समारोह की अपेक्षा करता है real -> real इसके पहले तर्क के रूप में। हम के व्युत्पन्न के लिए एक सन्निकटन की गणना कर सकते हैं पर . सही उत्तर है .

- d' (fn x => x * x * x - x - 1.0) 3.0;
val it = 25.9999996644 : real

पुस्तकालय

मानक

द बेसिस लाइब्रेरी[6] मानकीकृत किया गया है और अधिकांश कार्यान्वयन के साथ जहाज। यह ट्री, सरणियों और अन्य डेटा संरचनाओं के साथ-साथ इनपुट/आउटपुट और सिस्टम इंटरफेस के लिए मॉड्यूल प्रदान करता है।

तीसरा पक्ष

संख्यात्मक कंप्यूटिंग के लिए, एक मैट्रिक्स मॉड्यूल मौजूद है (लेकिन वर्तमान में टूटा हुआ है), https://www.cs.cmu.edu/afs/cs/project/pscico/pscico/src/matrix/README.html।

ग्राफिक्स के लिए, काहिरा-एसएमएल काहिरा (ग्राफिक्स) ग्राफिक्स लाइब्रेरी के लिए एक ओपन सोर्स इंटरफेस है। मशीन लर्निंग के लिए, ग्राफिकल मॉडल के लिए एक लाइब्रेरी मौजूद है।

कार्यान्वयन

मानक एमएल के कार्यान्वयन में निम्नलिखित सम्मिलित हैं:

मानक

  • HaMLet: एक मानक एमएल दुभाषिया जिसका उद्देश्य मानक का सटीक और सुलभ संदर्भ कार्यान्वयन होना है।
  • MLton (mlton.org): एक इंटरप्रोसेरल अनुकूलन|पूरे-प्रोग्राम ऑप्टिमाइज़िंग कंपाइलर जो कड़ाई से परिभाषा के अनुरूप है और कंपाइलर#बैक एंड सहित अन्य एमएल कार्यान्वयनों की तुलना में बहुत तेज़ कोड उत्पन्न करता है एलएलवीएम और सी के लिए।
  • मास्को एमएल: कैमल रनटाइम इंजन पर आधारित एक हल्का कार्यान्वयन, जो मॉड्यूल और अधिकांश आधार सहित पूर्ण मानक एमएल भाषा को लागू करता है पुस्तकालय।
  • Poly/ML: मानक एमएल का एक पूर्ण कार्यान्वयन जो फास्ट कोड बनाता है और मल्टीकोर हार्डवेयर (पॉज़िक्स थ्रेड्स के माध्यम से) का समर्थन करता है; इसका रनटाइम सिस्टम समानांतर कचरा संग्रहण और अपरिवर्तनीय उप-संरचनाओं का ऑनलाइन साझाकरण करता है।
  • न्यू जर्सी के मानक एमएल (smlnj.org): एक पूर्ण संकलक, संबंधित पुस्तकालयों, उपकरणों, एक इंटरैक्टिव खोल, और समवर्ती एमएल के समर्थन के साथ दस्तावेज़ीकरण के साथ।
  • SML.NET: अन्य .NET Framework|.NET कोड के साथ जोड़ने के लिए एक्सटेंशन के साथ सामान्य भाषा रनटाइम के लिए एक मानक एमएल कंपाइलर।
  • एमएल किट Archived 2016-01-07 at the Wayback Machine: वास्तविक समय के अनुप्रयोगों का समर्थन करने के उद्देश्य से एक कचरा संग्राहक (जिसे अक्षम किया जा सकता है) और क्षेत्रों के स्वत: अनुमान के साथ क्षेत्र-आधारित मेमोरी प्रबंधन को एकीकृत करते हुए परिभाषा पर बहुत बारीकी से आधारित कार्यान्वयन।

डेरिवेटिव

  • ऐलिस (प्रोग्रामिंग भाषा): फ्यूचर्स और वादों, आलसी मूल्यांकन, दूरस्थ प्रक्रिया कॉल और बाधा प्रोग्रामिंग के माध्यम से वितरित कंप्यूटिंग के समर्थन के साथ सारलैंड विश्वविद्यालय द्वारा मानक एमएल के लिए एक दुभाषिया।
  • SML#: रिकॉर्ड बहुरूपता और C भाषा इंटरऑपरेबिलिटी प्रदान करने वाले एसएमएल का विस्तार। यह एक पारंपरिक नेटिव कंपाइलर है और इसका नाम not है जो .NET फ्रेमवर्क पर चलने का संकेत है।
  • SOSML: टाइपप्रति में लिखा गया एक कार्यान्वयन, अधिकांश एसएमएल भाषा का समर्थन करता है और आधार पुस्तकालय के कुछ हिस्सों का चयन करता है।

शोध करना

  • CakeML औपचारिक रूप से सत्यापित रनटाइम और असेंबलर के लिए अनुवाद के साथ एमएल का आरईपीएल संस्करण है।
  • इसाबेल (सबूत सहायक) (इसाबेल/एमएल) आधिकारिक मानक एमएल (एसएमएल) के लिए एक परिष्कृत आईडीई (जे संपादित करें पर आधारित) के साथ एक इंटरैक्टिव प्रमेय प्रोवर में समानांतर पॉली/एमएल को एकीकृत करता है। '97), इसाबेल/एमएल बोली, और प्रमाण भाषा। इसाबेल2016 से प्रारम्भ होकर, एमएल के लिए एक स्रोत-स्तरीय डिबगर भी है।
  • पॉपलॉग सामान्य लिस्प और प्रोलॉग के साथ मानक एमएल के एक संस्करण को लागू करता है, जिससे मिश्रित भाषा प्रोग्रामिंग की अनुमति मिलती है; सभी POP-11 में लागू किए गए हैं, जो वृद्धिशील संकलक है।
  • TILT मानक एमएल के लिए एक पूर्ण प्रमाणित संकलक है जो कार्यक्रम अनुकूलन कोड में टाइप किए गए इंटरमीडिएट प्रतिनिधित्व का उपयोग करता है और शुद्धता सुनिश्चित करता है, और टाइप किए गए असेंबली को संकलित कर सकता है भाषा।

ये सभी कार्यान्वयन ओपन-सोर्स लाइसेंस | ओपन-सोर्स हैं और स्वतंत्र रूप से उपलब्ध हैं। अधिकांश स्वयं मानक एमएल में लागू होते हैं। अब कोई व्यावसायिक कार्यान्वयन नहीं है; हार्लेक्विन (सॉफ्टवेयर कंपनी), जो अब निष्क्रिय है, ने एक बार MLWorks नामक एक वाणिज्यिक IDE और कंपाइलर का उत्पादन किया, जो Xanalys को दिया गया और बाद में 26 अप्रैल, 2013 को रेवेनब्रुक लिमिटेड द्वारा अधिग्रहित किए जाने के बाद इसे ओपन-सोर्स किया गया है।

SML का उपयोग करने वाली प्रमुख परियोजनाएँ

कोपेनहेगन के आईटी विश्वविद्यालय का संपूर्ण उद्यम स्थापत्य एसएमएल की लगभग 100,000 लाइनों में लागू किया गया है, जिसमें स्टाफ रिकॉर्ड, पेरोल, कोर्स एडमिनिस्ट्रेशन और फीडबैक, स्टूडेंट प्रोजेक्ट मैनेजमेंट और वेब-आधारित सेल्फ-सर्विस इंटरफेस सम्मिलित हैं।[7]

प्रूफ असिस्टेंट एचओएल (प्रूफ असिस्टेंट), इसाबेल (प्रूफ असिस्टेंट), [[लेगो (सबूत सहायक)]] और बारह स्टैंडर्ड एमएल में लिखे गए हैं। इसका उपयोग कंपाइलर # कंपाइलर निर्माण और एआरएम वास्तुकला जैसे एकीकृत सर्किट डिजाइनरों द्वारा भी किया जाता है।[8]

यह भी देखें

संदर्भ

  1. 1.0 1.1 "Programming in Standard ML: Hierarchies and Parameterization". Retrieved 2020-02-22.
  2. 2.0 2.1 2.2 "SML '97". www.smlnj.org.
  3. 3.0 3.1 "itertools — Functions creating iterators for efficient looping — Python 3.7.1rc1 documentation". docs.python.org.
  4. 4.0 4.1 Robin Milner; Mads Tofte; Robert Harper; David MacQueen (1997). The Definition of Standard ML (Revised). MIT Press. ISBN 0-262-63181-4.
  5. 5.0 5.1 Chris Okasaki (2000). "Breadth-First Numbering: Lessons from a Small Exercise in Algorithm Design". International Conference on Functional Programming 2000. ACM.
  6. "Standard ML Basis Library". smlfamily.github.io. Retrieved 2022-01-10.
  7. 7.0 7.1 Mads Tofte (2009). "Standard ML language". Scholarpedia. 4 (2): 7515. Bibcode:2009SchpJ...4.7515T. doi:10.4249/scholarpedia.7515.
  8. 8.0 8.1 Jade Alglave; Anthony C. J. Fox; Samin Ishtiaq; Magnus O. Myreen; Susmit Sarkar; Peter Sewell; Francesco Zappa Nardelli. The Semantics of Power and ARM Multiprocessor Machine Code (PDF). DAMP 2009. pp. 13–24.

बाहरी संबंध

About Standard ML

About successor ML

Practical

Academic