के स्पष्ट उपयोग के लिए एक महत्वपूर्ण कारण rec
हिंडले-मिलनर प्रकार के आविष्कार के साथ करना है, जो सभी स्थैतिक रूप से टाइप किए गए कार्यात्मक प्रोग्रामिंग भाषाओं (विभिन्न तरीकों से परिवर्तित और विस्तारित) को रेखांकित करता है।
यदि आपके पास एक परिभाषा है let f x = x
, तो आप इसे टाइप करने 'a -> 'a
और अलग-अलग पर लागू होने की अपेक्षा करेंगे'a
-अलग बिंदुओं प्रकारों पर । लेकिन समान रूप से, यदि आप लिखते हैं, तो आप शेष शरीर के रूप में व्यवहार किए जाने की let g x = (x + 1) + ...
अपेक्षा x
करेंगे ।int
g
जिस तरह से हिंडले-मिलनर ने इस भेद से संबंधित है, वह एक स्पष्ट सामान्यीकरण कदम के माध्यम से है । आपके प्रोग्राम को संसाधित करते समय कुछ बिंदुओं पर, टाइप सिस्टम बंद हो जाता है और कहता है "ठीक है, इस बिंदु पर इन परिभाषाओं के प्रकारों को सामान्यीकृत किया जाएगा, ताकि जब कोई उनका उपयोग करे, तो उनके प्रकार का कोई भी मुफ्त प्रकार का चर ताजे तात्कालिक रूप से, और इस प्रकार होगा इस परिभाषा के किसी अन्य उपयोग में हस्तक्षेप नहीं करेगा। "
यह पता चला है कि इस सामान्यीकरण को करने के लिए समझदार जगह कार्यों के एक पारस्परिक पुनरावर्ती सेट की जांच करने के बाद है। पहले कोई भी, और आप बहुत अधिक सामान्य कर लेंगे, उन स्थितियों के लिए जहां प्रकार वास्तव में टकरा सकते हैं। किसी भी बाद में, और आप बहुत कम सामान्यीकरण करेंगे, जिससे कई प्रकार के इंस्टेंटिएशन के साथ उपयोग नहीं किया जा सकता है।
इसलिए, यह देखते हुए कि टाइप चेकर को यह जानने की जरूरत है कि परिभाषाओं के कौन से सेट परस्पर पुनरावर्ती हैं, यह क्या कर सकता है? एक संभावना बस एक दायरे में सभी परिभाषाओं पर निर्भरता विश्लेषण करना है, और उन्हें सबसे छोटे संभव समूहों में फिर से व्यवस्थित करना है। हास्केल वास्तव में ऐसा करता है, लेकिन एफ # (और ओकेएमएल और एसएमएल) जैसी भाषाओं में अप्रतिबंधित साइड-इफेक्ट्स होते हैं, यह एक बुरा विचार है क्योंकि यह साइड-इफेक्ट्स को भी पुन: व्यवस्थित कर सकता है। इसलिए इसके बजाय यह उपयोगकर्ता को स्पष्ट रूप से चिह्नित करने के लिए कहता है कि कौन सी परिभाषाएं पारस्परिक रूप से पुनरावर्ती हैं, और इस प्रकार विस्तार द्वारा जहां सामान्यीकरण होना चाहिए।