Polymorphic recursion

In computer science, polymorphic recursion (also referred to as MilnerMycroft typability or the MilnerMycroft calculus) refers to a recursiveparametrically polymorphicfunction where the type parameter changes with each recursive invocation made, instead of staying constant. Type inference for polymorphic recursion is equivalent to semi-unification and therefore undecidable and requires the use of a semi-algorithm or programmer-supplied type annotations.[1]

Example

Nested datatypes

Consider the following nested datatype in Haskell:

dataNesteda=a:<:(Nested[a])|Epsiloninfixr5:<:nested=1:<:[2,3,4]:<:[[5,6],[7],[8,9]]:<:Epsilon

A length function defined over this datatype will be polymorphically recursive, as the type of the argument changes from Nested a to Nested [a] in the recursive call:

length::Nesteda->IntlengthEpsilon=0length(_:<:xs)=1+lengthxs

Note that Haskell normally infers the type signature for a function as simple-looking as this, but here it cannot be omitted without triggering a type error.

Higher-ranked types

Applications

Program analysis

In type-based program analysis polymorphic recursion is often essential in gaining high precision of the analysis. Notable examples of systems employing polymorphic recursion include Dussart, Henglein and Mossin's binding-time analysis[2] and the TofteTalpin region-based memory management system.[3] As these systems assume the expressions have already been typed in an underlying type system (not necessary employing polymorphic recursion), inference can be made decidable again.

Data structures, error detection, graph solutions

تستخدم هياكل بيانات البرمجة الوظيفية غالبًا الاستدعاء الذاتي متعدد الأشكال لتبسيط عمليات التحقق من أخطاء النوع وحل المشكلات التي تتطلب حلولًا مؤقتة "وسيطة" معقدة تستهلك الذاكرة بشكل كبير في هياكل البيانات التقليدية مثل الأشجار. في المرجعين التاليين،  يقدم أوكازاكي (ص 144-146) مثالًا على CONS في لغة هاسكل ، حيث يقوم نظام النوع متعدد الأشكال تلقائيًا بتحديد أخطاء المبرمج. [ 4 ] يتمثل الجانب الاستدعائي في أن تعريف النوع يضمن أن يكون للمنشئ الخارجي عنصر واحد، والثاني زوج، والثالث زوج من الأزواج، وهكذا بشكل استدعائي، مما يُنشئ نمطًا تلقائيًا لاكتشاف الأخطاء في نوع البيانات.  يقدم روبرتس (ص 171) مثالًا مشابهًا في لغة جافا ، باستخدام فئة لتمثيل إطار مكدس. المثال المعطى هو حل لمسألة برج هانوي ، حيث يحاكي المكدس الاستدعاء الذاتي متعدد الأشكال مع بنية استبدال مكدس متداخلة في البداية والمؤقتة والنهاية. [ 5 ]

انظر أيضاً

ملحوظات

  1. هينجلين 1993 .
  2. دوسارت، ديرك؛ هينجلين، فريتز ؛ موسين، كريستيان. "التكرار متعدد الأشكال ومؤهلات النوع الفرعي: تحليل وقت الربط متعدد الأشكال في وقت متعدد الحدود". وقائع الندوة الدولية الثانية للتحليل الثابت (SAS) . CiteSeerX 10.1.1.646.5884 . 
  3. توفت، مادز ؛ تالبين، جان بيير (1994). "تنفيذ حساب لامدا المكتوب بالقيمة باستخدام مكدس من المناطق". POPL '94: وقائع الندوة الحادية والعشرين لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة . نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM. الصفحات 188-201 . doi : 10.1145/174675.177855 . ISBN  0-89791-636-0.
  4. كريس أوكازاكي (1999). هياكل البيانات الوظيفية البحتة . نيويورك: كامبريدج. ص 144. ISBN  978-0521663502.
  5. ↑ إريك روبرتس ( 2006). التفكير التكراري باستخدام جافا . نيويورك: وايلي. ص 171. ISBN  978-0471701460.

للمزيد من القراءة