2010-09-15 15 views

उत्तर

20

एमएल भाषाओं स्थिर लिखे जाते हैं, तो यह संभव अलग अलग समय पर अलग-अलग प्रकार के लिए के लिए कुछ नहीं है। x कभी-कभी int टाइप नहीं कर सकता है और दूसरी बार string टाइप किया जा सकता है। आप इस तरह से व्यवहार की जरूरत है, इसके बारे में जाने के लिए सामान्य तरीके से एक कंटेनर है कि टाइप जानकारी encodes, की तरह में मूल्य रैप करने के लिए है:

datatype wrapper = Int of int | Real of real | String of string 

तो आप कर सकते हैं निर्माता पर पैटर्न मैचों की:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

इस मामले में, x स्पष्ट रूप से wrapper के रूप में टाइप किया गया है, इसलिए यह काम करेगा।

8

x पॉलीमोर्फिक प्रकार का है (चक सुझाव के रूप में खुद को लपेटने के बिना) सामान्य रूप से करना संभव नहीं है।

यह एक जानबूझकर डिजाइन निर्णय है; यह केवल उनके प्रकारों के आधार पर कार्यों के बारे में बहुत मजबूत निष्कर्ष निकालना संभव बनाता है, जिससे आप अन्यथा नहीं कर सकते। उदाहरण के लिए, यह आपको यह कहने देता है कि 'a -> 'a प्रकार वाला फ़ंक्शन पहचान फ़ंक्शन होना चाहिए (या एक ऐसा फ़ंक्शन जो हमेशा अपवाद फेंकता है, या कोई फ़ंक्शन जो कभी वापस नहीं आता)। आप का निरीक्षण कर सकता है क्या 'a क्रम पर था, आप की तरह

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

उस नियम का उल्लंघन होगा एक डरपोक कार्यक्रम लिख सकते हैं। (यह एक बहुत ही मामूली उदाहरण है, लेकिन आपके प्रकार के सिस्टम में यह संपत्ति जानकर आप बहुत कम छोटी-छोटी चीजें कर सकते हैं।)

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